Java中的MapStruct实现详解
作者:一码评川
这篇文章主要介绍了Java中的MapStruct实现详解,MapStruct 是一个代码生成器,它基于约定优先于配置的方法大大简化了 JavaBean 类型之间映射的实现,生成的映射代码使用普通方法调用,需要的朋友可以参考下
简单实现
引入依赖
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.3.0.Final</version> </dependency> //注解处理器,根据注解自动生成mapper的实现 <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> </dependency>
我们在编译时会报 java: No property named “numberOfSeats” exists in source parameter(s). Did you mean “null”? 错误,经过查阅资料发现 mapstruct-processor 和 Lombok 的版本需要统一一下:mapstruct-processor:1.2.0.Final , Lombok:1.16.14。
准备实体类
Car.java 和 数据传输类 CarDto.java
@NoArgsConstructor @AllArgsConstructor @Data public class Car { private String make; private int numberOfSeats; private CarType type; } @Data @NoArgsConstructor @AllArgsConstructor public class CarDto { private String make; private int seatCount; private String type; }
创建映射器接口
定义映射方法
@Mapper public interface CarMapper { CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); @Mapping(source = "numberOfSeats", target = "seatCount") CarDto carToCarDto(Car car); }
解析分析:
- @Mapper 将接口标记为映射接口,并允许 MapStruct 处理器在编译期间启动。这里的 @Mapper 注解不是 mybatis 的注解,而是 org.mapstruct.Mapper 的;
- 实际映射方法 carToCarDto() 期望源对象 Car 作为参数,并返回目标对象 CarDto ,方法名可以自由选择;
- 对于源对象和目标对象中具有不同名称的属性,可以使用 @Mapping 注释来配置名称;
- 对于源对象和目标对象中具有不同类型的属性,也可以使用 @Mapping 注释来进行转换,比如:类型属性将从枚举类型转换为字符串;
- 一个接口中可以有多个映射方法,对于所有的这些方法,MapStruct 将生成一个实现;
- 该接口的实现实例可以从 Mappers 中获得,接口声明一个 INSTANCE,为客户端提供对映射器实现的访问。
实现类
我们可以将代码进行编译,然后会发现在 target 文件中生成了 CarMapperImpl.class 文件:
从代码中可以看出 MapStruct 为我们自动生成了 set/get 代码,并且对枚举类进行了特殊处理。
客户端
@Test public void shouldMapCarToDto() { Car car = new Car( "Morris", 5, CarType.SEDAN ); CarDto carDto = CarMapper.INSTANCE.carToCarDto( car ); System.out.println(carDto); }
执行结果:
小结: MapStruct 基于 mapper 接口,在编译期动态生成 set/get 代码的 class 文件 ,在运行时直接调用该 class 文件。
到此这篇关于Java中的MapStruct实现详解的文章就介绍到这了,更多相关MapStruct实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!