起因
在开发 Hot Key IM项目起步阶段用户进行登录注册之后,需要返回 UserVO 对象,该对象由User 和 UserInfo 两个POJO 对象聚合而来,未了避免使用 BeanUtils 这种浅拷贝工具,因为其原理是通过放射方式拷贝,效率低下,并且不安全,所以接入 mapstruct 工具。
此时在掘金找了一篇起步教程,导入依赖:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
之后,配置了 maven plugin:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.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>
错误
添加完 plugin 后就写完代码允许,结果完美出错,Lombok 所有注解失效了,一大堆 getter ,setter 找不到
解决过程
因为以前遇到过类似的错误,所以直接Google 搜索了 Lombok 注解失效 ,找到的全部解决方法如下:
- 确认真的在项目中成功导入了 lombok 依赖:通过查看 dependencies tree 列表是否真的导入了lombok, 如果没有导入请导入后重试
- 导入的 lombok 是否版本正确:是否本身该版本就是有问题的;是否和工程的 Spring ,Spring Boot 环境版本想兼容或匹配,如果可以请尝试升级 lombok 版本
- IDEA是否下载并且启用 Lombok 插件,IDEA 是否开启了注解处理器: Annotation Processor, 如果没有下载请下载并启用,如果启用了,请检查 File -> Setting -> Compiler -> Enable Annotation Processor 开启
除此之外在没有找到更多的答案了。
但是这些都不能解决我的问题,在这时想起了以前 使用 Gradle 工程的时候使用 lombok 需要单独再配置lombok 的 Annotation Processor,这时便想起来,我在 pom.xml 文件中指定了使用 mapstruct-processor 的注解处理器,是不是就相当于覆盖了Lombok 的注解处理器?
抱着试一试的态度,我去除了 上面引入的 mapstrucrt 的<plugin>您猜怎么着, 可以了lombok注解生效了
问题的关键就是这里了。
解决方法
在导入 mapstruct 依赖的时候看到提示有两个 mapstruct 相关的依赖,而且根据刚刚导入的 plugin 的内容应该就是需要寻找者processor处理器
心想要不试试这个依赖,接下来果断去除 mapstruct 的plugin ,然后导入此依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
刷新,启动,查看 class path 类文件输出,此时可以看到已经有了 lombok 生成的 方法,并且 mapstruct 类也是生效的。
总结
请不用使用plugin,而是直接导入两个相关依赖就行,在需要使用mapstruct 的模块导入两个依赖即可
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>