一、maven引入
<!-- mapstruct依赖 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、准备两个需要转换的实体类
package com.example.demo.vo;
import lombok.Data;
@Data
public class Goods {
private String goodsName;
private String code;
private String id;
private String date;
private String year;
}
package com.example.demo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@ApiModel(description = "入参实体")
public class GoodsVO {
@ApiModelProperty(value = "名字")
private String name;
@ApiModelProperty(value = "编码", required = true)
private String code;
@ApiModelProperty(value = "id", required = true)
private Long id;
@ApiModelProperty(value = "时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+08:00")
private Date dateTime;
}
三、新建实例类转换接口,定义好自己的转换方法
package com.example.demo.mapstruct;
import com.example.demo.vo.Goods;
import com.example.demo.vo.GoodsVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = "spring", uses = {TypeConversionWorker.class})
public interface GoodsTransfer {
GoodsTransfer INSTANCE = Mappers.getMapper(GoodsTransfer.class);
@Mappings({
@Mapping(source = "name", target = "goodsName"),
@Mapping(source = "dateTime", target = "date", dateFormat = "yyyy-MM-dd"),
@Mapping(source = "name", target = "year", qualifiedByName = "change")
})
Goods goodsVo2goods(GoodsVO vo);
}
上面的接口包含了特殊字段转换函数TypeConversionWorker.change,不需要的可以自行去掉。
package com.example.demo.mapstruct;
import org.mapstruct.Named;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Component
@Named("TypeConversionWorker")
public class TypeConversionWorker {
@Named("change")
public String change(String str) {
if (StringUtils.isEmpty(str)) {
return str;
}
return str + "年";
}
}
四、实践
需要转换做实体类转换的地方直接引入接口并调用
@Resource
private GoodsTransfer goodsTransfer;
// 调用
Goods goods = goodsTransfer.goodsVo2goods(goodsVO)
项目编译后在target/classes/com目录下会发现自动生成了GoodsTransfer接口的实现类,打开看一下会明白,其实体类的转换不是基于反射实现的,所以效率更高,也更安全。