当前位置: 首页 > news >正文

mapstruct与lombok冲突原因及解决方案

问题背景说明

MapStruct 和 Lombok 都是 Java 开发中常用的代码生成工具,但两者在编译时的注解处理器(Annotation Processor)机制上存在冲突。MapStruct 依赖生成的代码进行对象映射,而 Lombok 用于自动生成 getter/setter 等方法。若未正确配置,可能导致编译失败或生成的代码不完整。


冲突原因分析

  1. 注解处理器执行顺序问题:Lombok 和 MapStruct 的注解处理器在编译时可能因顺序问题相互干扰。
  2. 代码生成时机冲突:Lombok 生成的代码可能未被 MapStruct 及时识别,导致映射失败。
  3. IDE 兼容性问题:部分 IDE(如 IntelliJ IDEA)对注解处理器的支持需要额外配置。 如果你用的IntelliJ IDEA版本是2023及以上的版本,Lombok对应的版本也会与老版的IDE有所不同,因此高版本的Lombok对应的MapStruct需要额外的一些配置。

解决方案

配置编译插件顺序

在 Maven 或 Gradle 中明确指定注解处理器的执行顺序,确保 Lombok 先于 MapStruct 执行。
MapStruct官网中写了 Lombok 1.18.16 引入了一个重大更改(更新日志)。 必须添加额外的注释处理器 (Maven),否则 MapStruct 将停止与 Lombok 一起工作。
https://mapstruct.org/documentation/stable/reference/html/#lombok
Lombok 1.18.16 引入了一个重大更改
官网也给出了解决方式
mapstruct与lombok冲突解决方案

对应 Maven 示例

<!-- 我用的IntelliJ IDEA版本是2023.3.4 -->
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
<lombok.version>1.18.22</lombok.version>
<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><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></path><!-- additional annotation processor required as of Lombok 1.18.16 --><path><groupId>org.projectlombok</groupId><artifactId>lombok-mapstruct-binding</artifactId><version>0.2.0</version></path></annotationProcessorPaths></configuration></plugin></plugins></build>

Gradle 示例

dependencies {  compileOnly 'org.projectlombok:lombok'  annotationProcessor 'org.projectlombok:lombok'  annotationProcessor 'org.mapstruct:mapstruct-processor'  
}  
IDE 特定配置

IntelliJ IDEA 用户

  1. 启用注解处理器:
    • 路径:Settings > Build > Compiler > Annotation Processors,勾选 Enable annotation processing
  2. 确保 Lombok 插件已安装并启用。

Eclipse 用户

  1. 安装 Lombok 插件并重启 IDE。
  2. 检查项目属性中 Java Compiler > Annotation Processing 是否启用。

验证解决方案

  1. 编写一个简单的 DTO 和实体类,使用 Lombok 的 @Data 和 MapStruct 的 @Mapper
  2. 编译项目,确认无错误且生成的映射代码完整。
  3. 运行单元测试验证对象转换逻辑。

常见问题排查

  1. 编译失败:检查依赖版本是否兼容,如 MapStruct 1.5+ 和 Lombok 1.18.16+。
  2. 代码未生成:清理项目并重新构建(mvn clean compilegradle clean build)。
  3. IDE 报错:尝试重启 IDE 或重新导入项目。
http://www.dtcms.com/a/277426.html

相关文章:

  • 【Linux 学习指南】网络基础概念(一):从协议到分层,看透计算机通信的底层逻辑
  • LeetCode|Day9|976. 三角形的最大周长|Python刷题笔记
  • 通过反射,提取 Cat 类 泛型 父类 接口 属性 的具体类型参数
  • 【一起来学AI大模型】部署优化推理加速:TensorRT-LLM
  • 华为交换机 undo negotiation auto功能(华为交换机端口接光纤两端起不来)
  • Jvm优化高手-笔记
  • Cursor精准上下文指定
  • 印度纱丽变革:传统靛蓝工艺在无性别斗篷中的延续
  • TensorFlow深度学习实战(24)——变分自编码器详解与实现
  • 基于Springboot+UniApp+Ai实现模拟面试小工具三:后端项目基础框架搭建上
  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • React强大且灵活hooks库——ahooks入门实践之生命周期类hook(lifecycle)详解
  • vite---环境变量和模式配置(.env 文件)
  • 【论文阅读】Think Only When You Need with Large Hybrid-Reasoning Models
  • Linux进程状态实战指南:转换关系、监控命令与状态解析
  • 【Linux | 网络】应用层(HTTP)
  • html-input 系列
  • 二进制、八进制、十进制、十六进制的转换
  • 用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • 【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】
  • 早期 CNN 的经典模型—卷积神经网络(LeNet)
  • 在Linux文件写入软件设计中,直接写入SSD时磁盘写入抖动(I/O延迟波动)的解决方案
  • [CH582M入门第六步]软件IIC驱动AHT10
  • Leetcode 3613. Minimize Maximum Component Cost
  • Vue文件上传实战指南
  • 深入理解 Linux 文件系统层级结构
  • Python 数据挖掘之数据探索
  • CCS-MSPM0G3507-7-模块篇-MPU6050的基本使用
  • Spring Boot 安全登录系统:前后端分离实现