如何解决mapstruct和lombok冲突问题

mapstruct与lombok冲突原因及解决方案 Lombok 1.18.16 引入了一个重大更改(更新日志)。 必须添加额外的注释处理器 (Maven),否则 MapStruct 将停止与 Lombok 一起工作。 阅读详情
AI摘要

本文介绍了在使用MapStruct进行对象属性映射时遇到的问题,即在Maven安装过程中出现属性找不到的错误。解决方案是确保Lombok版本至少为1.18.16,并在Maven的`annotationProcessorPaths`中正确配置MapStruct和Lombok。通过一个简单的MapStruct映射例子,展示了如何创建接口并自动实现属性转换。在测试中,展示了如何将Person对象转换为PersonDto对象。

一、冲突如何产生

在按照官网配置mapstruct,使用lombok。当我们在maven install时候会出现属性找不到错误。

二、解决配置如下

  1. 确保 Lombok 最低版本为 1.18.16
  2. annotationProcessorPaths 中,要配置lombok
<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>1.18.16</version>
                        </path>
                        <!-- This is needed when using Lombok 1.18.16 and above -->
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

三、mapstruct简单例子

MapStruct就是这样的一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。

  • 创建两个对象Person 和 PersonDto
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person {

    private String username;
    private String address;
    private int age;
    private String idCard;
    private String email;

}


@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PersonDto {

    private String username;
    private String address;
    private int age;
    private String identityCard;
    private String email;

}
  • 写一个 Mapper 接口 PersonConverter是单实体映射方法

若源对象属性与目标对象属性名字一致,会自动映射对应属性,不一样的需要指定,也可以用 format 转成自己想要的类型,也支持表达式的方式,可以看到像 name、email等这些名词一致的我并没有指定 source-target,而idCard指定了。

@Mapper
public interface PersonConver {

    PersonConver INSTANCE = Mappers.getMapper(PersonConver.class);

    @Mapping(source = "idCard",target = "identityCard")
    PersonDto converDto(Person person);

}
  • 编译MapStruct之后,手工编译或者启动 IDE 的时候 IDE 也会帮我们编译, 会自动target/classes 下生成对应的实现类PersonConverImpl 
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-01-06T22:05:16+0800",
    comments = "version: 1.4.2.Final, compiler: javac, environment: Java 1.8.0_202 (Oracle Corporation)"
)
public class PersonConverImpl implements PersonConver {

    @Override
    public PersonDto converDto(Person person) {
        if ( person == null ) {
            return null;
        }

        PersonDto personDto = new PersonDto();

        personDto.setIdentityCard( person.getIdCard() );
        personDto.setUsername( person.getUsername() );
        personDto.setAddress( person.getAddress() );
        personDto.setAge( person.getAge() );
        personDto.setEmail( person.getEmail() );

        return personDto;
    }
}
  • 写一个单元测试类 Test 测试一下,看看效果
    @org.junit.Test
    public void test() {
        Person person = new Person();
        person.setUsername("张三");
        person.setAge(20);
        person.setEmail("20003@qq.com");
        person.setIdCard("2333");
        person.setAddress("北京市丰台区");
        PersonDto personDto = PersonConver.INSTANCE.converDto(person);
        System.out.println(personDto);
    }

 详细代码地址为:mapstruct

Java实体映射工具:MapStruct 当我们需要进行Java Model之间的拷贝时,或者项目要求Java Model需要严格区分为数据对象(DO)、数据传输对象(DTO)和展示对象(VO)的时候,我们就不得不把一个实体中的属性映射到另一个实体中。最简单的做法就是写一个工具类,进行不断的getter / setter,这样虽然能完成要求但却写了很多冗余代码,维护起来相当恶心。所以这个时候就需要一款能自动映射实体属性的工具了。 Spring自带的BeanUtils工具类算是一款,但是它却不能自定义映射规则;ModelMapper也是一款映射工具 阅读详情

相关推荐

应用中引入MapStruct导致Lombok不生效的问题解决方法

当我们在应用中引入MapStruct之后,Lombok不生效了的问题解决方法

悠杨的专栏 2035

MapStruct 和 Lombok 版本冲突问题

解决MapStruct和Lombok高版本冲突问题

qq_34870127的博客 5480

MapStruct与Lombok冲突?教你一招解决编译顺序问题(附完整POM配置)

本文深入剖析了Java开发中MapStruct与Lombok因注解处理器执行顺序冲突导致实现类无法生成的根本原因。通过提供完整的Maven POM配置方案,明确指定Lombok优先于MapStruct执行的顺序,并详解了IntelliJ IDEA与Eclipse的IDE同步配置,从而彻底解决编译问题,实现两大工具的高效协同。

efc12345678的博客 702

MapStruct和Lombok结合使用的问题

MapStruct和Lombok结合使用的问题

weixin_43076660的博客 1439

使用 MapStruct Plus 时遇到问题的解决方案

博主在 MapStruct Plus 使用进行项目开发的时候,遇到了几个小问题,在这里做个总结也给同样遇到问题的人一个解决思路的参考。

weixin_54620350的博客 1143

【踩坑专栏】mapstruct无法生成实现类

我想很多人都知道mapstruct这个工具,它可以帮助我们通过接口的声明方法和编译生成实现类,简单的将对象进行转换,同名的字段默认直接转换,甚至通过@Mappings和@Mapping注解将不同名的字段转换。而且写完实体T的转换方法,可以写对应的List的转换方法,非常使用。和lombok双剑合璧,基本上get set 对象转换这些琐碎但是又必须的事情就可以很快完成。上述是对mapstruct这个工具的简单介绍,基于上述背景,我在同时使用mapstruct和lombok的时候,发现mapstruct无法转换

不想睡觉的橘子君的博客 1万+

mapstruct引入不生效:解决mapstruct与lombok二者版本冲突问题

问题: 引入了mapstruct的依赖,但是转换器的实现类中,并没有该实体的get/set方法进行属性赋值。 解决: 版本问题,mapstruct、lombok、maven的版本不对劲。 mapstruct 使用1.2.0 lombok使用1.16.22 是可行的。 或者在pom文件中加入这样一段: 升高maven-compiler-plugin的版本,同样可以解决问题。 <build> <plugins> <plugin>

numbbe的博客 1万+

金蝶云星空-协同开发云-安装开发环境

金蝶协同开发云就是不需要每一个开发都在自己的本机安装开发环境,自己安装可容易出错,包括源代码管理也一并解决了,大大减少了开发人员的工作量和降低了上手的难度。

qq_33881408的博客 5598

java全家桶之7:java lomok 与map structure 冲突解决

- MapStruct 后执行 -->-- Lombok 先执行 -->-- 确保注解处理器顺序正确 -->按照上述步骤,99% 的冲突问题可以解决。如果仍有问题,可以尝试。@Data // 自动生成 getter/setter。MapStruct 依赖 Lombok 生成的。如果顺序错误,MapStruct 会找不到属性。,导致 MapStruct 找不到属性。或编译时 Lombok 未生成。在 Java 项目中同时使用。如果仍然报错,可以在。或检查日志详细错误。(读取生成的代码)。

leijmdas的专栏 943

CAD制图

CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。·CAD三维开发是指使用计算机程序和工具来创建、编辑和操作三维模型、图形和设计的过程。它在工程、建筑、制造和游戏等领域广泛应用。CAD三维开发可能涉及到复杂的图形算法、性能优化、并行计算等方面的内容,因此需要深入学习和实践,以提高开发的效率和质量。

RZer的博客 1654

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

lombok提示找不到符号的问题

lombok编译报错

ZULJ131的博客 1881

Renesas:定时器输入捕获

一、PWM输入捕获 1、Smart Configurator配置 注意:在使用前,需要使能对应的定时器!否侧无法正常进行输入捕获! 2、脉冲宽度的获取 如何区分高低电平的脉冲宽度:最常用的方法就是在触发中断后,判断IO口的高低电平,来确认是上升沿触发的中断还是下降沿触发的中断。 若无法进入中断,可查看:Renesas:配置中断的常规流程 (1)中断方式(Smart Configurator生成的代码) #pragma interrupt r_Config_TAUB0_0_i...

不吃鱼的猫的博客 2483

mapstruct 对象转换,属性为null

mapstruct 对象转换,属性为null

DAX的个人博客 4786

模电仿真软件:MultSim14.3下载与安装

在setup文件夹中,找到【Install.exe】文件,然后右键单击选择【以管理员身份运行】(这一步超级重要,否则可能会出现权限不足导致安装失败)!解压完成后,打开解压出来的文件夹,找到并进入【setup】文件夹(这一步很重要,不要进错文件夹)。4、在弹出的安装向导中,仔细阅读许可协议后,选择【我接受】,然后点击【下一步】继续安装过程。首先我们需要将下载好的安装包解压到本地文件夹,确保有足够的磁盘空间(建议至少5GB以上)!按照安装向导的提示,点击【下一步】继续(保持默认设置即可,除非你有特殊需求)

weixin_44264994的博客 2337

最终篇——SWAT模型的建立

同理,Soil Data也是同样的方法导入,在Soil Database Options的选项中,选择UserSiol,用同样的方法导入土壤类型,进行重分类。打开窗口后,只定义HRU Thresholdes,其余两个不用设置,设定各数据单元的计算率,这里的10%的意思是计算精度,即分成级HRU计算单元太小,小于平均计算单元的10%,我们就不对这HRU单元进行计算(也就是说太破碎的计算单元不进行计算),若选择0%意味着全部进行计算,需要耗费大量的内存和时间,对计算机要求较高,不建议。

m0_72556434的博客 5622

MapStruct与lombok加载顺序问题与annotationProcessorPaths的关系?

MapStruct是什么? MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach.——https://mapstruct.org/ 从...

经典鸡翅 5238

PCL SVD分解求变换矩阵【2026最新版】

该算例使用奇异矩阵分解来求变换矩阵,输入的是同名点坐标输出的是变换矩阵。博客长期更新,本文最近一次更新时间为:2026年5月10日。

点云侠的博客 36万+

MyBatis/MyBatis-Plus、MapStruct、Lombok同时使用,解决编译顺序问题

MyBatis/MyBatis-Plus、MapStruct、Lombok同时使用,解决编译顺序问题

Meta39的博客 1309

【测开求职】面试题:JAVA 吐血整理

本篇文章包含本次测开工程师秋招过程中遇到的所有JAVA面试题,全文两万字,亲测应对各个大厂的面试毫无压力👉

vector的博客 1211

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ruoyi框架mapstruct和lombok 引入,及之间的冲突

mapstruct依赖lombok生成的setter 、getter方法,所以编译的需要有个先后顺序,就是上面的annotationProcessorPaths 中 lombok一定要在前面。3、所以在需要的子module里面可以直接引入mapstruct(为了可以所有模块里面都可以使用,可以再ruoyi-common里面引入)因为ruoyi的根pom的dependencyManagement里面有下面的import。

shang_an_1的博客 2257

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Lombok和MapStruct整合

可以自行在classes里看生成的代码 因为他们他们都是编译时通过AnnotationProcessor生成的class文件,然后MapStruct会用到对象中的get、set方法,然后get、set方法又需要lombok来生成。所以我们需要空着这两者工作顺序。lombok 1.18.16之前,添加pathlombok 1.18.16之后,添加path,必须使用 lombok-mapstruct-binding 插件。本着用新不用旧的想法我选了第二种...

weixin_53953440的博客 492

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

mapstruct与lombok一起使用问题

受够了代码中的BeanUtils.copyProperties,和同事聊起来被安利了mapstruct这个骚东西, 它是自动生成set方法进行类型转换的,不使用反射,效率极好而已友好。遂动手引入mapstruct,但是因为项目中原本就集成了lombok,引入mapstruct之后巨多问题,一顿骚操作之后,把注解包和功能包都直接放在依赖中之后,仍然会有偶尔无法正常生成方法实现的问题,如下: public XXXVO toXXXVO(XXXModel model) { if ( mo

南山有谷堆 4996

记录一些遇见的bug——Lombok和Mapstruct的冲突导致,A component required a bean of type ‘com.XXX.controller.converter.

由于 MapStruct 依赖于 JavaBean 中有 getter/setter 方法,所以,如果使用了 lombok 来生成 getter/setter 方法的话,那么在配置上有一些特殊的地方:需要 lombok 先对 .class 文件"动手脚",然后 MapStruct 再来对 .class 文件"动手脚"。如果你的项目同时使用了Lombok和Mapstruct工具,写了dto转换类,例如下面的BrandConverter转换类。未找到BrandConverter的bean。再次启动,不再报错。.

weixin_56039103的博客 1910

springboot 使用mapstruct映射字段全是null,映射不了字段

刚开始以为是版本冲突问题,实际上是因为项目使用了lombok,引入mapstruct依赖在lombok依赖之前,所以导致mapstruct生成实现类时无法发现get,set方法。将lombok依赖引入顺序放到mapstruct依赖之前即可解决。

遨游大海 1377
上一篇: Python爬虫xpath详解
下一篇: 如何使用idea远程debug调试代码详解
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值