JavaBean的对象转换器,mapstruct+lombok组合使用
吐槽一波
根据官方文档给出的教程,结合Lombok插件,出现不生成对应的impl实现类的问题,然后查阅了网上各方面的资料和ruoyi-pro具体的实现方法,在下面我将给出解决方法。
mapstruct是什么?能解决什么问题?
1、翻译一下官方文档资料,说明一下是什么东西!!!
MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现。
生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。
2、能解决什么问题?
多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。
3、用起来怎么样?
MapStruct是一个注释处理器,它插入Java编译器,可以在命令行构建(Maven,Gradle等)以及您首选的IDE中使用。
MapStruct使用合理的默认值,但在配置或实现特殊行为时会让你不碍事。
总结一句话:mapstruct 是一个代码生成器,生成的代码实现了对象的转化,例如开发过程中entity转化成DTO对象。
4、各个对象转换方案对比
方案 | 优点 | 缺点 |
---|---|---|
手写对象转换 | 1、操作灵活 2、便于之后的重构 |
1. 重复性工作多 2. 手写代码容易遗漏掉有些字段 |
BeanUtil.copy | 1. 使用简单 2. Apache 的包效率比较低,spring 的包效率可以接受 |
1. 复杂场景支持不足,控制 copy 粒度太粗 2. 不易重构 |
mapstruct | 1. 灵活性高支持简单,复杂,嵌套,自定义扩展等多种手段 2. 编译期生成,没有效率问题 |
不方便之后的重构 |
正文开始,来来来
- 引入pom依赖,并放上和Lombok配合使用出现问题的解决方案,少说废话,直接copy
<dependencies><!--mapstruct对象转换--><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-jdk8</artifactId><version>1.5.3.Final</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.3.Final</version></dependency></dependencies><build><plugins><!-- maven-compiler-plugin 插件,解决 spring-boot-configuration-processor + Lombok + MapStruct 组合 --><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.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.7.8</version></path><!-- Lombok 在编译时会通过这个插件生成代码 --><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></path><!-- MapStruct 在编译时会通过这个插件生成代码 --><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.5.3.Final</version></path></annotationProcessorPaths></configuration></plugin></plugins></build>
2.entity类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Car {private String make;private int numberOfSeats;//constructor, getters, setters etc.
}
3.对象映射类DTO
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CarDto {private String make;private int seatCount;//constructor, getters, setters etc.
}
4.对象映射转化接口类Mapper
注意哈:如果项目中结合的mybatisORM框架,要注意@Mapper
引入的注解,是不是mapstruct的。
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;@Mapper
public interface CarMapper {CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); @Mapping(source = "numberOfSeats", target = "seatCount")CarDto carToCarDto(Car car);
}
5.构建代码,build一下查看生成的impl,出现小箭头,就代表生成好了impl实体类
import javax.annotation.Generated;@Generated(value = "org.mapstruct.ap.MappingProcessor",date = "2023-04-10T16:38:00+0800",comments = "version: 1.5.3.Final, compiler: javac, environment: Java 1.8.0_351 (Oracle Corporation)"
)
public class CarMapperImpl implements CarMapper {@Overridepublic CarDto carToCarDto(Car car) {if ( car == null ) {return null;}CarDto carDto = new CarDto();carDto.setSeatCount( car.getNumberOfSeats() );carDto.setMake( car.getMake() );return carDto;}
}