自定义数据模型Converter

前言

在基于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后端程序测了一下,上边是输入,下边是输出,确实是按照预期来的
这里写图片描述

很简单的代码,但是确实挺实用的,也是很好的能帮助我们写出更优雅的更合理的代码,也是自己的积累,希望对读者有所帮助。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值