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
我想这会对你有所帮助......