MapStruct的入门教程
MapStruct的入门教程
为什么需要MapStruct
多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写此类映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过使其尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct在编译时生成Bean映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。
什么是MapStruct
MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。
生成的映射代码使用简单的方法调用,因此快速,类型安全且易于理解。
MapStruct是一个注释处理器,已插入Java编译器,可用于命令行构建(Maven,Gradle等),也可以在您首选的IDE中使用。
MapStruct使用合理的默认值,但是在配置或实现特殊行为时会避开您的使用。
MapStruct初体验
-
下面显示了如何使用MapStruct映射两个对象。假设我们有一个代表汽车的类
Car
(例如JPA实体)和一个附带的数据传输对象CarDto
(DTO)。两种类型非常相似,只有座位数属性具有不同的名称,并且该类型属性在Car
类中具有特殊的枚举类型,但在DTO中是纯字符串。public class Car { private String make; private int numberOfSeats; private CarType type; //constructor, getters, setters etc. } public class CarDto { private String make; private int seatCount; private String type; //constructor, getters, setters etc. }
-
要生成用于从
CarDto
对象中创建对象Car的映射器,需要定义一个映射器接口:@Mapper public interface CarMapper { CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); @Mapping(source = "numberOfSeats", target = "seatCount") CarDto carToCarDto(Car car); }
该@Mapper注解将接口标记为映射接口,并使MapStruct处理器在编译期间启动。实际的映射方法
carToCarDto
期望源对象作为参数并返回目标对象。其名称可以自由选择。
对于源对象和目标对象中具有不同名称的属性,可以使用@Mapping
注解来配置名称。在必要和可能的情况下,将对源和目标中具有不同类型的属性执行类型转换,例如,将type属性从枚举类型转换为字符串。
当然,一个接口中可以有多种映射方法,MapStruct将为所有这些方法生成一个实现。可以从Mappers类中检索接口实现的实例。按照约定,该接口声明一个成员INSTANCE,为客户提供对Mapper实施的访问权限。 -
使用映射器。基于映射器接口,客户端可以以非常简单且类型安全的方式执行对象映射:
@Test public void shouldMapCarToDto() { //given Car car = new Car( "Morris", 5, CarType.SEDAN ); //when CarDto carDto = CarMapper.INSTANCE.carToCarDto( car ); //then assertThat( carDto ).isNotNull(); assertThat( carDto.getMake() ).isEqualTo( "Morris" ); assertThat( carDto.getSeatCount() ).isEqualTo( 5 ); assertThat( carDto.getType() ).isEqualTo( "SEDAN" ); }