首页 > 其他分享 >如何正确导入mapstruct,同时避免编译时mapstruct与lombok冲突

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

时间:2024-11-12 11:41:28浏览次数:1  
标签:mapstruct MapStruct projectlombok 导入 org lombok Lombok

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

一般情况下只需要按照官网的导入即可,但如果同时使用了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 上找到一个工作示例。

标签:mapstruct,MapStruct,projectlombok,导入,org,lombok,Lombok
From: https://www.cnblogs.com/milkbox/p/18541517

相关文章

  • SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错
    注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配第一种方法:首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有错误后接......
  • 大数据量导入去重的优化方法探讨
    文章目录大数据量导入去重的优化方法探讨使用临时表缓存导入数据使用SQL查询不重复数据将不重复数据插入原始表性能对比分析单表去重双表去重总结大数据量导入去重的优化方法探讨在处理大规模数据导入(如十万级别)时,难免会遇到数据重复的问题。特别是当导入的数据......
  • MapStruct笔记
    依赖包<dependency><groupId>org.mapstruct</groupId><!--jdk8以下就使用mapstruct--><artifactId>mapstruct-jdk8</artifactId><version>1.2.0.Final</version></dependency><dependency>......
  • Chrome浏览器如何导出所有书签并导入书签
    前言我平常在开发中,基本是用的谷歌的浏览器,也就是Chrome,因为这个对于开发来说,比较友好。在开发中,包括调试接口,打断点,查看打印日志等,都是非常不错的。另一方面,谷歌浏览器的书签管理功能,可以让我将我发现的好的网站或者博客等,变成我的书签,到时候我可以迅速的打开这些网页。不过,由......
  • 失物招领信息管理系统(含源码+sql+视频导入教程+文档+PPT)
    失物招领信息管理系统1、项目介绍失物招领信息管理系统1拥有两种角色,分别为管理员和用户,具体功能如下:管理员:招领信息管理、寻物信息管理、留言信息管理、申请信息管理、物品类型管理、学生管理、管理员管理、公告管理用户:招领信息查看与发布、寻物信息查看与发布、留言......
  • 基于SSM的书店图书销售管理系统(含源码+sql+视频导入教程+文档+PPT)
    1、项目介绍书店图书销售管理系统3具有两种个角色,分别为管理员和用户,具体功能如下:管理员:书籍的增删改查、书籍类型的增删改查、用户的增删改查、订单审核、订单详情查看等功能用户:书籍的模糊查询、购买数据、购物车、结算、注册登录等功能2·、项目技术后端框架:SSM(Spr......
  • 将URDF模型文件导入Issac_Gym系列【1】
    1在solidworks中导出URDF文件1这里按照古月居老师的要求进行基本的配置https://www.bilibili.com/video/BV1Tx411o7rH/?vd_source=fcddcf87e97b17fd530dc88db643aab3关于catkin_ws这种ROS的工作环境的配置,具体可以参考我的这篇博客https://www.cnblogs.com/myleaf/p/1846629......
  • import导入文件路径注意点
    目录结构-lib-main.py-package1-subA.py-subB.py-package2-subC.py-subD.py要在main文件中导入subA#方案1-main.pyfrompackage1importsubA#方案2-main.pyfromlib.package1importsubA要在main文件中,通过subA导......
  • Vue 3 项目中导入外部的 <link> 和 <script> 资源
    在Vue3项目中,可以通过以下几种方式来导入外部的<link>和<script>资源:导入外部CSS文件方法1:在单个组件中使用 <style> 标签可以在单个Vue组件的<style>部分使用@import语句来导入外部CSS文件:<template><!--组件模板--></template><scriptsetup......
  • 导入csv文件到milvus
    1.创建表milvus_cliconnect-urihttp://192.168.1.134:19530-troot:Milvususedatabase-ddb_testcreatecollection-ctb_test02-fid:INT64:primary_field-fvector:FLOAT_VECTOR:128-fa1:INT64:a1-fb1:VARCHAR:32-pid-A-d'car_collection' 2.准备数据......