首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内置转换器的复杂弹簧转换器?

内置转换器的复杂弹簧转换器?
EN

Stack Overflow用户
提问于 2013-06-27 06:55:39
回答 5查看 3K关注 0票数 1

我有一个复杂的对象,它需要嵌套的Converter,比如我有B类,它包括A的实例。

代码语言:javascript
复制
 class A {
    ....
   }

   class B {
    A a;
    ....
   }

我为A写了一个转换器,它可以转换成其他的类,比如"AA“。现在我需要编写一个将B转换为其他类的转换器。因为B里面有A。我需要把A转换成另一个东西"AA“。我正在利用Converter模式。看到这个:injecting ConversionService into a custom Converter有比这更好的方法吗?我不希望在自定义工厂类中初始化转换器。

EN

回答 5

Stack Overflow用户

发布于 2013-06-27 16:12:18

使用BB类,如:

代码语言:javascript
复制
class BB {
  ....
  AA aa;
  ....
}

您可以简单地这样做:

代码语言:javascript
复制
public BB convert(B b) {

  BB bb = new BB();
  bb.aa = new AToAAConverter().convert(b.a);
  ....

您仍然可以在ConversionServiceFactoryBean中注册您的AToAAConverter

票数 2
EN

Stack Overflow用户

发布于 2018-03-23 04:06:41

你可以做这样的事情。创建一个转换器服务并注入您声明的一组转换器bean。在某些情况下,您的转换器可能需要访问converterService。你可以通过使用@Lazy注解来绕过循环引用。如果存在其他conversionServices,您可能需要@Primary来让spring知道您声明的converterService应该优先注入。在某些情况下,让转换器访问转换服务是很有用的。您可以通过将转换服务从当前转换器内部分派到正确的转换器来保持松散耦合。此外,这允许您重用一个通用的转换器,从其他转换器,消除代码重复。

代码语言:javascript
复制
/**
 * @author vsutskever 3/22/18
 **/
@Configuration
public class ConverterConfig {


  /**
   * Circular reference. This beans depends on Conversion service. Using @Lazy to resolve.
   * @param service
   * @return
   */
  @Bean
  public Converter dispositionMessageConverter(
      @Lazy ConversionService service){
    return new DispositionMessageRequestToOutgoingMessage(service);
  }

  /**
   * Circular reference. This beans depends on Conversion service. Using @Lazy to resolve.
   * @param service
   * @return
   */
  @Bean
  public Converter contentMessageRequestToOutgoingMessageConverter(
      @Lazy ConversionService service){
    return new ContentMessageRequestToOutgoingMessageConverter(service);
  }

  @Bean
  public Converter incomingRcsMessageToBaseMessageConverter(){
    return new IncomingRcsMessageToBaseMessageConverter();
  }

  @Bean
  public Converter contactToAddressConverter(){
    return new ContactToAddressConverter();
  }

  @Bean
  @Primary
  public ConversionService conversionService(List<Converter> converters){
    ConversionServiceFactoryBean factory = new ConversionServiceFactoryBean();
    factory.setConverters(new HashSet<>(converters));
    factory.afterPropertiesSet();
    return factory.getObject();
  }

}
票数 2
EN

Stack Overflow用户

发布于 2018-09-11 14:26:05

我找到了一个不用编写自定义conversionService的解决方案,使用@Lazy注解来解决循环依赖。

Configuration类如下所示:

代码语言:javascript
复制
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    @Lazy
    private ConversionService mConversionService;

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(aConverter());
        registry.addConverter(bConverter());
    }

    @Bean
    public AConverter aConverter() {
        return new AConverter();
    }

    @Bean
    public BConverter bConverter() {
        return new BConverter(mConversionService);
    }
}

AConverterBConverter都实现了org.springframework.core.convert.converter.Converter<S,T>,因为AConverter将类A转换为AABConverter将类B转换为另一个包含A的类。

更新

WebConfig构造函数中注入ConversionService更好,这样可以避免字段注入:

代码语言:javascript
复制
@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final ConversionService mConversionService;

    @Autowired
    public WebConfig(@Lazy ConversionService conversionService) {
        mConversionService = conversionService;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17331823

复制
相关文章

相似问题

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