Spring ConversionService添加转换器

我搜索了下面的问题,但找不到答案。

我想通过编写实现org.springframework.core.convert.converter.Converter的自定义转换器来使用spring的转换服务。

然后我添加我的自定义转换器如下:

       

在执行上述操作时,我的应用程序初始化失败,因为我重写了bean conversionService并仅注册了我的自定义转换器。

我怎么能不覆盖conversionService并只将我的自定义转换器添加到转换器列表中,同时保留现有转换器?

提前致谢。

对于那些现在通过谷歌搜索或类似问题最初发布后2年以上发现的人,通过Java Config添加转换器变得更加容易: WebMvcConfigurerAdapter提供了可用于指定其他自定义的addFormatters(FormatterRegistry)方法转换器。

在尝试不同的方式,甚至在一些春季源代码中我遇到了一个有趣的事情。

我发现使用conversionService而不用现有转换器覆盖现有转换器的唯一方法是扩展或重新实现conversionService,调用超类的afterPropertiesSet()方法来注册默认转换器,然后添加自定义转换器。

但即使我使用这种方式,在运行时我得到一个例外,没有找到我的特定类型的转换器(例如从String到Logger)。

这引发了我的兴趣,我按照弹簧源代码找出原因,我意识到spring正试图找到一个使用PropertyEditor注册的自定义转换器。 我不确定为什么会这样。 我必须在这里添加我的应用程序不使用spring mvc和conversionService可能以某种方式需要注册,我没有这样做。

最后,我解决了使用Property编辑器注册自定义转换器的问题。 本文档可视为参考:

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html

我很想知道为什么Spring没有在conversionService的注册表中找到我注册的自定义转换器(或者至少为什么Spring没有查看该注册表来查找自定义转换器)。 我错过了任何配置吗?

当spring> 4时,不再需要实现ConversionService的自己派生。 在@Configuration注释类中初始化它,如下所示:

 @Configuration public class ConversionServiceProvider { @Autowired private MyConverterImpl myConverter; @Bean public ConversionService getConversionService() { ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean(); bean.setConverters( getConverters() ); bean.afterPropertiesSet(); ConversionService object = bean.getObject(); return object; } private Set> getConverters() { Set> converters = new HashSet>(); converters.add( myConverter ); // add here more custom converters, either as spring bean references or directly instantiated return converters; } 

}

在Stackoverflow中遇到了一个非常有趣的方法 – https://stackoverflow.com/a/12760579/204788

使用名为Collection merge的function,您基本上可以这样做:

        

它足以覆盖ConversionServiceFactoryBean.afterPropertiesSet()并将ConversionService对象设置为转换器。 让您的转换器实现一些允许设置ConversionService对象的接口,比如ConversionServiceAware。 唯一的问题是访问已注册的转换器,因此您还必须覆盖’setConverters()’方法。

 public class MyFormattingConversionServiceFactoryBean extends FormattingConversionServiceFactoryBean { private Set cachedConverters = new LinkedHashSet<>(); @Override public void setConverters(Set converters) { super.setConverters(converters); this.cachedConverters = new LinkedHashSet<>(converters); } @Override public void afterPropertiesSet() { super.afterPropertiesSet(); FormattingConversionService conversionService = getObject(); for (Object converter : cachedConverters) { if (converter instanceof ConversionServiceAware) { ((ConversionServiceAware) converter).setConversionService(conversionService); } } } } 

您还可以在DefaultConversionService-ish类上使用addConverter方法以dinamically方式添加它:

 DefaultConversionService cs = new (); cs.addConverter(new MyConverter()); 

编写自定义的conversionService

 public class CustomerConversionServiceFactoryBean extends ConversionServiceFactoryBean { List> converters = new ArrayList<>(); public CustomerConversionServiceFactoryBean() { super(); DefaultConversionService conversionservice = (DefaultConversionService) super.getObject(); for(int i=0;i 

然后改变你的xml

        

我想这会对你有所帮助......