lombok和MapStruct(踩坑记录)
MapStruct: https://mapstruct.org/documentation/stable/reference/html/#Preface
坑
今天本来想学一下MapStruct这个 bean 映射器的,但是按照文档加入依赖后,启动项目,一直报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ... <properties > <org.mapstruct.version > 1.5.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 > ...
异常信息是找不到实体类的Get和Set方法
出坑
查看最后taget文件夹下lombok生成class,确实是没有生成get/set方法
我确保我的实体类加上了@Data
注解还有lombok
的依赖和插件,但是就是没有生成对应的代码
想了想以前重来没有发生过这种事情,只有在加入MapStruct才出现这种问题,那么显然这应该是MapStruct和Lombok的兼容问题了
官方文档
后来确实在MapStruct的常见问题 中找到了相关回答
并且给出了相关的项目代码示例
解决方法
在maven插件的annotationProcessorPaths
标签下加上lombok
和lombok-mapstruct-binding
的注解处理路径就好了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <modelVersion > 4.0.0</modelVersion > <groupId > org.mapstruct.examples.lombok</groupId > <artifactId > mapstruct-examples-lombok</artifactId > <version > 1.0-SNAPSHOT</version > <packaging > jar</packaging > <properties > <project.build.sourceEncoding > UTF-8</project.build.sourceEncoding > <maven.compiler.source > 1.8</maven.compiler.source > <maven.compiler.target > 1.8</maven.compiler.target > <org.mapstruct.version > 1.5.2.Final</org.mapstruct.version > <org.projectlombok.version > 1.18.20</org.projectlombok.version > <lombok-mapstruct-binding.version > 0.2.0</lombok-mapstruct-binding.version > </properties > <dependencies > ...... </dependencies > <build > <pluginManagement > <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 > <path > <groupId > org.projectlombok</groupId > <artifactId > lombok</artifactId > <version > ${org.projectlombok.version}</version > </path > <path > <groupId > org.projectlombok</groupId > <artifactId > lombok-mapstruct-binding</artifactId > <version > ${lombok-mapstruct-binding.version}</version > </path > </annotationProcessorPaths > </configuration > </plugin > </plugins > </pluginManagement > </build > </project >
问题原因
官方给出的pom示例中,只给出了mapstruct-processor
的注解处理器,没有加入lombok
的注解处理器,导致在编译期间没有处理lombok的注解也就没有生成对应代码
关于注解处理器可以看IDEA的官方文档
简单来说
您可以配置 IntelliJ IDEA 以在编译期间处理自定义注释。在编译时生成代码以处理注释的过程称为注释处理 。
注释处理器可以根据注释验证、生成和修改您的代码,这有助于您显着减少需要编写的代码量。注释处理器可以存储在您的项目中。在这种情况下,IntelliJ IDEA 从类路径中获取它。如果注解处理器存储在项目之外,那么您需要手动添加注解处理器 JAR 的路径。
当您通过Maven 或Gradle 项目中的构建脚本添加注释处理器时,IntelliJ IDEA 会自动启用注释处理并在注释处理器设置中添加适当的路径。