如何正确导入mapstruct,同时避免编译时mapstruct与lombok冲突

news/2024/11/14 5:37:52/文章来源:https://www.cnblogs.com/milkbox/p/18541517

本文介绍编译时产生的冲突,导包时期产生的冲突请劳驾查找其他解决方法

一般情况下只需要按照官网的导入即可,但如果同时使用了lombok,则需要小心。详细信息可以查看官网文档:MapStruct 1.5.5.Final 集成lombok

注意:在编译测试的时候,一定先清理再编译。这样可以解决80%的报错问题

出现如下问题请清理后再编译

[WARNING] 批注处理不适用于隐式编译的文件。使用 -implicit 指定用于隐式编译的策略。

如果配置不正确,则可能在编译的时候出现如下问题:

[ERROR] /E:/my_project_move/12_milkbox2/milkbox2-api/milkbox-service/service-sys/src/main/java/top/milkbox/sys/modular/menu/enums/SysMenuTypeEnum.java:[16,9] 无法将枚举 top.milkbox.sys.modular.menu.enums.SysMenuTypeEnum中的构造器 SysMenuTypeEnum应用到给定类型;需要: 没有参数找到:    java.lang.String,java.lang.String原因: 实际参数列表和形式参数列表长度不同

导入lombok和mapstruct

<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency><!-- mapstruct 数据类(bean)转换工具 -->
<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version>
</dependency>

除了导入mapstruct基础的包之外还需要配置这三个path

<!-- mapstruct 处理器 -->
<path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version>
</path>
<!-- mapstruct与lombok同时使用的时候必须要加这个,否则某些使用lombok注解的类会在编译的时候报错 -->
<path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version>
</path>
<!-- additional annotation processor required as of Lombok 1.18.16 -->
<!-- 从 Lombok 1.18.16 开始需要额外的注解处理器,这个版本之前的不用加 -->
<path><groupId>org.projectlombok</groupId><artifactId>lombok-mapstruct-binding</artifactId><version>0.2.0</version>
</path>

完整的配置如下

<?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>top.milkbox</groupId><artifactId>milkbox-api</artifactId><version>1.0-DEV</version><packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.1</version></parent><dependencies><!-- spring全家桶导包...... --><!-- 其他技术导包...... --><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- mapstruct 数据类(bean)转换工具 --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency><!-- 其他工具包结束 --></dependencies><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 锁定依赖版本号 --><org.mapstruct.version>1.5.5.Final</org.mapstruct.version></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target><encoding>UTF-8</encoding><annotationProcessorPaths><!-- mapstruct 处理器 --><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path><!-- mapstruct与lombok同时使用的时候必须要加这个,否则某些使用lombok注解的类会在编译的时候报错 --><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></path><!-- additional annotation processor required as of Lombok 1.18.16 --><!-- 从 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></project>

以下为官方文档原文中英对照(豆包ai翻译)

14.2. Lombok

MapStruct works together with Project Lombok as of MapStruct 1.2.0.Beta1 and Lombok 1.16.14.
MapStruct 与 MapStruct 1.2.0.Beta1 和 Lombok 1.16.14 的 Lombok 项目一起工作。

MapStruct takes advantage of generated getters, setters, and constructors and uses them to generate the mapper implementations.
MapStruct 利用生成的 getter、setter 和构造函数,并使用它们来生成 mapper 实现。

Lombok 1.18.16 introduces a breaking change (changelog). The additional annotation processor (Maven) must be added otherwise MapStruct stops working with Lombok. This resolves the compilation issues of Lombok and MapStruct modules.lombok-mapstruct-binding
Lombok 1.18.16 引入了一个重大更改(更新日志)。必须添加额外的注释处理器 (Maven),否则 MapStruct 将停止与 Lombok 一起工作。这将解决 Lombok 和 MapStruct 模块的编译问题。lombok-mapstruct-binding

<path><groupId>org.projectlombok</groupId><artifactId>lombok-mapstruct-binding</artifactId><version>0.2.0</version>
</path>

14.2.1. Set up 设置

The set up using Maven or Gradle does not differ from what is described in Set up. Additionally, you need to provide Lombok dependencies.
使用 Maven 或 Gradle 的设置与 设置中描述的设置没有区别。此外,您需要提供 Lombok 依赖项。

Example 116. Maven configuration
例 116.Maven 配置

<properties><org.mapstruct.version>1.5.5.Final</org.mapstruct.version><org.projectlombok.version>1.18.16</org.projectlombok.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target>
</properties><dependencies><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency><!-- lombok dependency should not end up on classpath --><!-- Lombok 依赖最终不应该出现在类路径上。(意思就是让你加上这个:<scope>provided</scope>) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version><scope>provided</scope></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><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${org.projectlombok.version}</version></path><!-- additional annotation processor required as of Lombok 1.18.16 --><!-- 从 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>

Example 117. Gradle configuration (3.4 and later)
例 117.Gradle 配置(3.4 及更高版本)

dependencies {implementation "org.mapstruct:mapstruct:${mapstructVersion}"compileOnly "org.projectlombok:lombok:1.18.16"annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0"annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"annotationProcessor "org.projectlombok:lombok:1.18.16"
}

The usage combines what you already know from Defining a mapper and Lombok.
该用法结合了您在定义映射器和 Lombok 中已经了解的内容。

Example 118. Usage of MapStruct with Lombok
例 118.MapStruct 在 Lombok 中的使用

@Data
public class Source {private String test;
}public class Target {private Long testing;public Long getTesting() {return testing;}public void setTesting( Long testing ) {this.testing = testing;}
}@Mapper
public interface SourceTargetMapper {SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );@Mapping( source = "test", target = "testing" )Target toTarget( Source s );
}

A working example can be found on the GitHub project mapstruct-lombok.
可以在 GitHub 项目 mapstruct-lombok 上找到一个工作示例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832204.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

施耐德UNITY下使用ST编程计算最近一小时的均值

昨晚学习练习了ST语言做最近60秒的分钟均值,今天继续做最近一小时的均值,1秒采集一次数据。在昨晚程序上增加功能,新建一个导出的功能块类型Average_Hour,定义下面的变量:旗下新建一个程序段Average_Hour,使用ST编程 Minute1:=BCD_TO_INT(%SW51);Minute:=mod_int(Minute1…

HyperWorks使用六面体和三棱柱单元进行实体网格剖分

本节将演示如何使用 solid map 功能对一个复杂的几何实体进行网格剖分。剖分的思路是:首先对该实体进行适当的切割,以使其各个部分均处于 mappable 的状态;然后分别对各个子块进行 solid map 剖分。事实上,针对同一个几何实体,可能有多种分块方案。究竟哪种方案能获得更高…

SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错

注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配 第一种方法: 首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有…

云消息队列 Kafka 版全面升级:经济、弹性、稳定,成本比自建最多降低 82%

本文整理于 2024 年云栖大会阿里云智能集团产品专家张凤婷带来的主题演讲《云消息队列 Kafka 版全面升级:经济、弹性、稳定》作者:娜米 本文整理于 2024 年云栖大会阿里云智能集团产品专家张凤婷带来的主题演讲《云消息队列 Kafka 版全面升级:经济、弹性、稳定》 云原生消息…

Java定时任务大盘点:发工资也能“指日可待”

作者:京东保险 孙昊宇 引子:“指日可待”让我们先从一个成语开始,“指日可待”。没错,我说的就是定时任务😏。“指日可待”: 为任务指定好日程,就可以安心等待任务执行。在实际场景中,我们往往需要在特定时间做某件事情,或以某个时间间隔重复某件事情,如定期备份数据…

B端体验深耕-洞察用户需求,打造心有灵犀的使用体验

作者:京东科技 程跃宇前言 我们常以“心有灵犀”来形容与合作伙伴的默契配合,若我们的产品能与用户达到同样的默契,将极大地提升用户在任务旅程中的流畅体验。 在B端体验设计领域,我们深知用户对我们产品的期待───快速完成任务、即用即走;然而,随着业务需求和产品功能…

YLCTF RE

Round1 [Round 1] xor kail upx脱壳,一眼顶针,xor v5 = [0x45, 0x50, 0x5f, 0x48, 0x5a, 0x67, 0x7f, 0x2d, 0x2b, 0x7e, 0x24, 0x78, 0x2c, 0x24, 0x31, 0x2c, 0x7e, 0x78, 0x24,0x31, 0x28, 0x2d, 0x7a, 0x7d, 0x31, 0x7e, 0x25, 0x79, 0x2b, 0x31, 0x29, 0x79, 0x2a, 0x2f…

RAG应用性能优化全景图:从查询到生成的6个关键阶段

引言 检索增强生成(Retrieval-Augmented Generation,RAG)技术已成为大语言模型(LLM)应用开发中的关键组成部分。然而,构建高效、准确的RAG系统仍然面临诸多挑战。本文将深入探讨RAG开发的6个关键阶段,并分析每个阶段的优化策略,为开发者提供全面的性能优化指南。 RAG开…

html 空白汉字占位符

符号表示&nbsp; 英文半角空格不换行&#160; 英文半角空格不换行&#12288; 中文全角空格&ensp; 半角空格&#8194; 半角空格&#8195; 全角空格&emsp; 全角空格&#8197; 四分之一全角空格&#32; 英文半角空格连续的&nbsp;会在同一行内…

ABB机器人维修IRC5控制器结构剖析

"【ABB机器人维修IRC5控制器性能低】——描述:控制器性能低,并且似乎无法正常工作。ABB机器人控制柜没有完全 “ 死机 ”。——后果:可能会观察到这些症状:程序执行迟缓,看上去无法正常执行并且有时停止。——可能的原因:计算机系统负载过高,可能因为以下其中一个或…

《Django 5 By Example》阅读笔记:p17-p53

《Django 5 By Example》学习第2天,p17-p53总结,总计37页。 一、技术总结 1.数据库迁移 python manage.py makemigrations blog python manage.py sqlmigrate blog 0001 python manage.py migrate 2.ORM Django自带ORM。 3.view (1)定义 p42, A Django view is just a Python…

CentOS虚拟机无法查看ipv4地址

CentOS默认没有开启ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens33将最后一行的ONBOOT=no修改为ONBOOT=yes 重启网卡服务 systemctl restart network然后 ip addr 查看ip目前这个是动态ip 如果要静态ip 继续编辑网卡配置文件ifcfg-ens33,将BOOTPROTO=dhcp修改为BOOTPRO…