三层架构实体类转换-mapstruct
说到实体类的转换,大家肯定不陌生,不就是一堆的**set()、get()么,但如果实体类的字段有一百多个,那不就是写死了么。
而后出现了BeanUtils.copyProperties(dog1,dog2 )**的对象转换类。
这个还是比较方便的,但是它的效率没有mapstruct高
下面我们来详细讲讲mapstruct的使用
mapstruct
首先,引入依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</dependency>
测试的实体类,记着加@Data注解
@Data
public class DishQuery {
private Long id;
private String name;
private Long categoryId;
private BigDecimal price;
private String code;
private String image;
private String description;
private Integer status;
private Integer sort;
private String createTime;
private String updateTime;
private Long createUser;
private Long updateUser;
}
--------------------------------------------------------------------
@Data
public class Dish implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//菜品名称
private String name;
//菜品分类id
private Long categoryId;
//菜品价格
private BigDecimal price;
//商品码
private String code;
//图片
private String image;
//描述信息
private String description;
//0 停售 1 起售
private Integer status;
//顺序
private Integer sort;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
}
编写接口
@Mapper(imports = DateUtil.class )
public interface DishConverter {
DishConverter mapper=Mappers.getMapper(DishConverter.class);
DishQuery entity2Query(Dish dish);
List<DishQuery> entity2Query(List<Dish> dishes);
// @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd")
@Mapping(target = "createTime", expression = "java(DateUtil.parse(dishQuery.getCreateTime()))")
Dish query2Entity(DishQuery dishQuery);
}
测试,简单粗暴
@Test
void contextLoads() throws InterruptedException {
DishQuery dish=new DishQuery();
dish.setCode("123");
dish.setCreateTime("2022-01-01");
//只需要这一句就行了
Dish dish1 = DishConverter.mapper.query2Entity(dish);
System.out.println(dish1);
}
这就好了,下面是一些扩展
不同属性之间的映射:
@Mapping(source = "name", target = "userName"),
不同类型之间的映射:
@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd")
@Mapping(target = "expireTime", expression = "java(LocalDateTimeUtil.getDateTimeOfDate(tradeOrderLS.getExpireTime()))"),
注意事项:
dateFormat和expression不能同时存在
转换的实体类都要有get()、set()
如果需要用到其他类,需要在类上通过@Mapper(imports = DateUtil.class ) 申明
如果出现这个错误!
java: Internal error in the mapping processor: java.lang.NullPointerExceptio
在使用MapStruct,idea2020.3版本在build项目的时候出现错误:java: Internal error in the mapping processor: java.lang.NullPointerException
解决:
1、Setting -->Build,Execution,Deployment -->Compiler -->User-local build加上参数:
-Djps.track.ap.dependencies=false
2、在pom.xml里面修改mapstruct-processor的版本,升级至1.4.1.Final或者更高版本
无法生成实现类:
Cannot find implementation for com.shanjupay.transaction.convert.PlatformChannelConvert
我碰到这个错误,是因为我的父工程中引入了依赖。而子工程没有引入。
**解决:**在子工程引入下就好了!