使用Spring mvc-3。我正在编写一个自定义转换器,需要访问注册到ConversionService的其他转换器。
我如何才能做到这一点呢?我试着把我的自定义转换器写成:
class CustomConverter<X, Y>{
@Autowired ConversionService service;
//+getter & setters of service
public Y convert(X input){
// I need access to service to lookup simple conversions such as
// String array to Long array etc..
}
}我通过applicationContext.xml注册了我的自定义转换器
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name = "converters">
<list>
<bean class="CustomConverter"/>
</list>
</property>
</bean>然而,spring拒绝向我的CustomConverter注入服务(它总是为空)。我如何才能做到这一点呢?
谢谢!
发布于 2012-01-06 18:29:12
我最近使用了类似的东西来解决这个问题。使用自定义工厂:
public class MyConversionServiceFactoryBean extends ConversionServiceFactoryBean {
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
ConversionService conversionService = getObject();
ConverterRegistry registry = (ConverterRegistry) conversionService;
// register converters that need a nested conversion service
registry.addConverter(new MyCustomConverter(conversionService));
}
}它是这样声明的:
<bean id="conversionService"
class="com.company.MyConversionServiceFactoryBean">
<property name="converters">
<list>
... declare standard converters here ...
</list>
</property>
</bean>发布于 2013-08-15 17:33:36
我也遇到过同样的问题。Spring JIRA中有一个issue SPR-6415来解决这个问题。基于对这个问题的讨论,我在这里给出了我的解决方案。它的原理与@nmervaillie的answer相同,但您不必实现自己的ConversionServiceFactoryBean。
/**
* Base class of @{code Converter} that need to use {@code ConversionService}.
* Instances of implementing classes must be spring-managed to inject ConversionService.
*
* @author Michal Kreuzman
*/
public abstract class CoversionServiceAwareConverter<S, T> implements Converter<S, T> {
@Inject
private ConversionService conversionService;
protected ConversionService conversionService() {
return conversionService;
}
/**
* Add this converter to {@code ConverterRegistry}.
*/
@SuppressWarnings("unused")
@PostConstruct
private void register() {
if (conversionService instanceof ConverterRegistry) {
((ConverterRegistry) conversionService).addConverter(this);
} else {
throw new IllegalStateException("Can't register Converter to ConverterRegistry");
}
}
}
@Component
public class SampleConverter extends CoversionServiceAwareConverter<Object, Object> {
@Override
public String convert(Object source) {
ConversionService conversionService = conversionService();
// Use conversionService and convert
}
}发布于 2016-04-09 19:57:46
我在以spring-ws为中心的应用程序中解决了这个问题。此解决方案的主要组件包括:
中的注入点上使用@Lazy from spring-
SampleConverter
@Component
public class SampleConverter implements Converter<Source, Target> {
private ConversionService conversionService;
@Inject
@Lazy
public SampleConverter(ConversionService conversionService){
this.conversionService = conversionService;
}
@Override
public Target convert(Source source){
Target target = new Target();
...
target.setTargetDetails(conversionService.convert(source.getSourceDetails, TargetDetails.class);
...和配置:
@Configuration
public class ConversionServiceConfig {
@Bean
public ConversionService conversionService(Set<Converter<?,?>> converters){
ConversionServiceFactoryBean csfb = new ConversionServiceFactoryBean();
csfb.setConverters(converters);
csfb.afterPropertiesSet();
return csfb.getObject();
}..。
@Lazy注释通过注入代理来绕过鸡蛋鸡问题,从而延迟转换服务bean的解析,直到它真正被使用。
https://stackoverflow.com/questions/8336387
复制相似问题