首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ConversionService注入自定义转换器

将ConversionService注入自定义转换器
EN

Stack Overflow用户
提问于 2011-12-01 12:03:23
回答 4查看 6.9K关注 0票数 12

使用Spring mvc-3。我正在编写一个自定义转换器,需要访问注册到ConversionService的其他转换器。

我如何才能做到这一点呢?我试着把我的自定义转换器写成:

代码语言:javascript
复制
  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注册了我的自定义转换器

代码语言:javascript
复制
  <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
     <property name = "converters">
         <list>
            <bean class="CustomConverter"/>
         </list>
     </property>
  </bean>

然而,spring拒绝向我的CustomConverter注入服务(它总是为空)。我如何才能做到这一点呢?

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-06 18:29:12

我最近使用了类似的东西来解决这个问题。使用自定义工厂:

代码语言:javascript
复制
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));
    }
}

它是这样声明的:

代码语言:javascript
复制
<bean id="conversionService"
    class="com.company.MyConversionServiceFactoryBean">
    <property name="converters">
        <list>
            ... declare standard converters here ...
        </list>
    </property>
</bean>
票数 7
EN

Stack Overflow用户

发布于 2013-08-15 17:33:36

我也遇到过同样的问题。Spring JIRA中有一个issue SPR-6415来解决这个问题。基于对这个问题的讨论,我在这里给出了我的解决方案。它的原理与@nmervaillie的answer相同,但您不必实现自己的ConversionServiceFactoryBean

代码语言:javascript
复制
/**
 * 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
    }
}
票数 10
EN

Stack Overflow用户

发布于 2016-04-09 19:57:46

我在以spring-ws为中心的应用程序中解决了这个问题。此解决方案的主要组件包括:

  • 将转换器实现声明为spring beans在ConversionServiceFactoryBean

中的注入点上使用@Lazy from spring-

  • 所有在spring bean中发现的转换器

SampleConverter

代码语言:javascript
复制
@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); 
    ...

和配置:

代码语言:javascript
复制
@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的解析,直到它真正被使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8336387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档