1.1背景:
每层(应用层,服务层,持久层)有自己的数据传输对象,当数据流程到该层由需要将数据转成符合要求的格式,比如:当数据由应用层流转到 服务层则需要将数据转成DTO格式,当数据由服务层流向持久层则需要将数据转成Entity格式数据。
下边的代码数据由服务层流向持久层:
@Override
public MerchantDTO createMerchant(MerchantDTO merchantDTO) {
Merchant merchant = new Merchant();
//设置审核状态0‐未申请,1‐已申请待审核,2‐审核通过,3‐审核拒绝
merchant.setAuditStatus("0");
//设置手机号
merchant.setMobile(merchantDTO.getMobile());
//...
//保存商户
merchantMapper.insert(merchant);
//将新增商户id返回
merchantDTO.setId(merchant.getId());
return merchantDTO;
}
上边代码的问题是:由merchantDTO转成entity实现过程繁琐。
1.2 MapStruct解决数据传输对象转换的繁琐
MapStruct是一个代码生成器,它基于约定优于配置的方法大大简化了Java Bean对象之间的映射转换的实现。MapStruct 使用简单的方法即可完成对象之间的转换,它速度快、类型安全且易于理解。
官方地址:MapStruct – Java bean mappings, the easy way!
1.3 添加MapStruct依赖。
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
2.1 服务层对象转换
在商户服务工程huiminpay-merchant-service定义商户对象转换类
定义MerchantConvert转换类,使用@Mapper注解快速实现对象转换
package com.huiminpay.merchant.convert;
import com.huiminpay.merchant.entity.Merchant;
import com.yh.merchant.api.dto.MerchantDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface MerchantConvert {
/**
* 为客户端提供对映射器的实现访问,官方文档定义
*/
MerchantConvert INSTANCE = Mappers.getMapper(MerchantConvert.class);
/**
* 将entity转换成DTO
*/
MerchantDTO entity2dto(Merchant merchant);
/**
* 将DTO转换成entity
*/
Merchant dto2entity(MerchantDTO merchantDTO);
}
在MerchantConvert中定义测试方法:
public static void main(String[] args) {
MerchantDTO merchantDTO = new MerchantDTO();
merchantDTO.setUsername("测试");
merchantDTO.setPassword("111");
Merchant entity = MerchantConvert.INSTANCE.dto2entity(merchantDTO);
System.out.println(entity);
//entity转dto
entity.setMobile("123444554");
MerchantDTO merchantDTO1 = MerchantConvert.INSTANCE.entity2dto(entity);
System.out.println(merchantDTO1);
}
2.2 List数据也可以转换:
/**
* List集合之间的转换
*/
List<MerchantDTO> listEntity2DTO(List<Merchant> list);
2.3 注意MapStruct版本问题
因工程内使用Swagger依赖MapStruct(其版本低与lombok同时使用会出现找不到实现类异常),解决办法如下,可在common工程内引用版本,并去除swagger中的MapStruct
解决办法
因为版本问题,需要先把swagger内置的依赖文件排除,然后重新添加依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<exclusions>
<exclusion>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</exclusion>
<exclusion>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>