同时使用lombok和mapstruct报“No property named "xxx" exists in source parameter(s).”

829 阅读1分钟

同时使用lombok和mapstruct报“No property named "xxx" exists in source parameter(s). Type "ZZZ" has no properties.”错误

原因:lombok和mapstruct都是在编译期通过注解处理器生成对应代码的,如果mapstruct的注解处理器比lombok的更早被执行,则POJO的成员变量的getter和setter方法都还没有被生成,此时就会报某某属性不存在的错误。

  • 解决方法一:

pom.xml中明确优先级,lombok放上面,则优先处理,如下:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.18</version>
    <scope>provided</scope>
</dependency>
 
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.3.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.3.Final</version>
    <scope>provided</scope>
</dependency>
  • 解决方法二:

将lombok和mapstruct-processor在maven-compiler-plugin的annotationProcessorPaths(注解处理器路径)中按上下顺序进行声明,这样lombok就会比mapstruct-processor更优先处理了,如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
                <annotationProcessorPaths>
                    <!-- 代码简化 -->
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.18</version>
                    </path>
                    <!-- 转换器 -->
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.3.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>