解决 MapStruct 项目启动后未生成对应实现类的问题
在使用 MapStruct 和 Lombok 时,可能会遇到项目启动成功后未生成对应实现类的问题。其主要原因在于编译顺序问题:MapStruct 需要在 Lombok 生成 getter 和 setter 方法之后再进行编译,否则会影响 MapStruct 生成属性拷贝方法的能力。
问题描述
在使用 Lombok 简化 Java 类代码时,例如使用 @Data 注解自动生成 getter、setter、toString 等方法。然而,当项目中同时使用 MapStruct 进行对象转换时,若未指定编译顺序,MapStruct 可能在 Lombok 生成对应方法之前就开始编译,这样 MapStruct 无法获取到正确的属性,从而导致未生成对应的实现类。
解决方案
在 Maven 项目中,可以通过在 pom.xml 文件中指定编译顺序来解决这个问题。具体步骤如下:
修改 pom.xml 文件
- 打开项目的
pom.xml文件。 - 找到
<build>标签下的<plugins>部分,添加或修改maven-compiler-plugin插件的配置,确保 Lombok 先于 MapStruct 编译。
以下是示例配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.9.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
在上述配置中,annotationProcessorPaths 标签下首先指定了 Lombok 的路径,确保 Lombok 在编译时优先执行,从而生成 getter 和 setter 方法。然后,再指定 MapStruct 的路径,确保 MapStruct 能够正确地获取到由 Lombok 生成的属性。
详细步骤
- 检查 Lombok 和 MapStruct 的版本:确保使用的 Lombok 和 MapStruct 版本兼容且为最新版本。
- 配置 Maven 编译插件:在
pom.xml中正确配置maven-compiler-plugin,并指定注解处理器的路径和顺序。 - 重新构建项目:保存
pom.xml文件并重新构建项目,验证是否成功生成 MapStruct 对应的实现类。
通过上述步骤,可以解决 MapStruct 项目启动后未生成对应实现类的问题,从而确保项目顺利运行。