我有一个复杂的对象,它需要嵌套的Converter,比如我有B类,它包括A的实例。
class A {
....
}
class B {
A a;
....
}我为A写了一个转换器,它可以转换成其他的类,比如"AA“。现在我需要编写一个将B转换为其他类的转换器。因为B里面有A。我需要把A转换成另一个东西"AA“。我正在利用Converter模式。看到这个:injecting ConversionService into a custom Converter有比这更好的方法吗?我不希望在自定义工厂类中初始化转换器。
发布于 2013-06-27 16:12:18
使用BB类,如:
class BB {
....
AA aa;
....
}您可以简单地这样做:
public BB convert(B b) {
BB bb = new BB();
bb.aa = new AToAAConverter().convert(b.a);
....您仍然可以在ConversionServiceFactoryBean中注册您的AToAAConverter。
发布于 2018-03-23 04:06:41
你可以做这样的事情。创建一个转换器服务并注入您声明的一组转换器bean。在某些情况下,您的转换器可能需要访问converterService。你可以通过使用@Lazy注解来绕过循环引用。如果存在其他conversionServices,您可能需要@Primary来让spring知道您声明的converterService应该优先注入。在某些情况下,让转换器访问转换服务是很有用的。您可以通过将转换服务从当前转换器内部分派到正确的转换器来保持松散耦合。此外,这允许您重用一个通用的转换器,从其他转换器,消除代码重复。
/**
* @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();
}
}发布于 2018-09-11 14:26:05
我找到了一个不用编写自定义conversionService的解决方案,使用@Lazy注解来解决循环依赖。
Configuration类如下所示:
@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);
}
}AConverter和BConverter都实现了org.springframework.core.convert.converter.Converter<S,T>,因为AConverter将类A转换为AA,BConverter将类B转换为另一个包含A的类。
更新
在WebConfig构造函数中注入ConversionService更好,这样可以避免字段注入:
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final ConversionService mConversionService;
@Autowired
public WebConfig(@Lazy ConversionService conversionService) {
mConversionService = conversionService;
}
}https://stackoverflow.com/questions/17331823
复制相似问题