前言
在基于spring的web后端程序开发过程中,经常会涉及到各种数据模型的转换,例如DTO -> DOMAIN -> ENTITY -> Resource,这样一条数据链中涉及到的模型转换可以说是相当多的,但是呢,如果把这些模型之间的转换代码放到业务逻辑里边时,会发现,代码到处都是一大块一大块,说得文明点就是一坨一坨的,相当难看,欠缺优雅。所以呢,我们可以使用Converter来统一管理我们所有的模型转换。
1. 定义源数据模型与目标数据模型
简单起见,就已name和 age作为属性
@Getter
@AllArgsConstructor
public class SourceModel {
private String srcName;
private Integer srcAge;
}
/**
* @author Lanny Yao
* @date 9/17/2018 4:15 PM
*/
@Setter
@Builder
public class DestinationModel {
private String desName;
private Integer desAge;
}
2. 自定义Converter,实现Converter接口,重写convert方法
这里为了测试效果,就直接将age加1,name后跟上”-des”。其实从如下代码已经
public class Src2DesConverter implements Converter<SourceModel, DestinationModel> {
/**
* self define convert strategy
*/
@Override
public DestinationModel convert(SourceModel source) {
return DestinationModel.builder()
.desAge(source.getSrcAge() + 1)
.desName(source.getSrcName() + "-des")
.build();
}
}
3. 注册Converter
定义好Converter之后,就得把它注册到某个地方,交给框架来管理,我们用的时候只需要用它的抽象层对吧,这才是我们的最终目的。
public interface ConfigurableConversionService extends ConversionService, ConverterRegistry {
}
看这个接口,既继承了ConversionService,也继承了ConverterRegistry,说明它是既支持模型转换,也支持转换器注册的对吧,ok, 那就好办了。
@Configuration
public class ConverterConfig {
@Autowired
private ConfigurableConversionService conversionService;
@Bean
@Primary
public ConfigurableConversionService getConversionService() {
return conversionService;
}
@PostConstruct
public void addConverters() {
//register converter
conversionService.addConverter(new Src2DesConverter());
}
}
代码中各个注解的含义,各位如果有不清楚的可以自行百度或者留言讨论哈,这里就不做过多讨论了。
4. 运用
注册号之后,运用起来就更简单啦,注入ConfigurableConversionService ,调用convert方法,参数是源数据模型和目标类,转换出来的就是我们自定义的目标数据模型。
@Service
public class ConverterService {
@Autowired
private ConfigurableConversionService conversionService;
public DestinationModel convert(SourceModel sourceModel) {
return conversionService.convert(sourceModel, DestinationModel.class);
}
}
写了个简单的web后端程序测了一下,上边是输入,下边是输出,确实是按照预期来的