1. 环境配置
1.1 Apache Maven
Maven配置
<properties><org.mapstruct.version>1.4.2.Final</org.mapstruct.version></properties>...<dependencies><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency></dependencies>...<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><annotationProcessorPaths><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path></annotationProcessorPaths></configuration></plugin></plugins></build>...
2. 定义Mapper
2.1. 基本mappings
定义一个mapper, 只需要简单的定义一个java接口, 定义上映射方法, 给方法加上 org.mapstruct.Mapper 注解.
例. 使用Java接口来定义一个mapper
import org.mapstruct.Mapper@Mapperpublic interface CarMapper {@Mapping(source = "make", target = "manufacturer")@Mapping(source = "numberOfSeats", target = "seatCount")CarDto carToCarDto(Car car);@Mapping(source = "name", target = "fullName")PersonDto personToPersonDto(Person person);}
@Mapper注解会触发MapStruct代码生成器在build阶段, 生成一个 CarMapper 接口的实现.Car 到 CarDto 的映射:
- 属性name相同, 会自动隐式映射.
- 属性name不同, 可以通过
@Mapping注解手动指定映射关系. - 通过
@BeanMapping(ignoreByDefault = true)来禁用自动默认映射, 要求必须要用@Mapping这种方式显式指定映射关系.
看一下自动生成的代码 carToCarDto()
- 例: MapStruct生成的代码
// GENERATED CODEpublic class CarMapperImpl implements CarMapper {@Overridepublic CarDto carToCarDto(Car car) {if ( car == null ) {return null;}CarDto carDto = new CarDto();if ( car.getFeatures() != null ) {carDto.setFeatures( new ArrayList<String>( car.getFeatures() ) );}carDto.setManufacturer( car.getMake() );carDto.setSeatCount( car.getNumberOfSeats() );carDto.setDriver( personToPersonDto( car.getDriver() ) );carDto.setPrice( String.valueOf( car.getPrice() ) );if ( car.getCategory() != null ) {carDto.setCategory( car.getCategory().toString() );}carDto.setEngine( engineToEngineDto( car.getEngine() ) );return carDto;}@Overridepublic PersonDto personToPersonDto(Person person) {//...}private EngineDto engineToEngineDto(Engine engine) {if ( engine == null ) {return null;}EngineDto engineDto = new EngineDto();engineDto.setHorsePower(engine.getHorsePower());engineDto.setFuel(engine.getFuel());return engineDto;}}
