如何解决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万+

Unity3D Pico VR 手势交互实战:基于MRTK3实现抓握与射线控制

本文针对Pico VR原生手势交互功能不足的问题,提供了基于MRTK3实现高级手势交互的实战解决方案。通过将MRTK3成熟的交互框架与Pico的手势追踪能力相结合,详细讲解了从环境配置、SDK导入、核心适配到真机调试的全流程,帮助开发者高效实现抓握与射线控制等复杂交互,有效提升Pico VR应用的开发效率与体验。

weixin_29011667的博客 391

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

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

leijmdas的专栏 943

电流采样(分流器与霍尔传感器)

霍尔效应霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。简单原理如图1所示,半导体薄片两端通以控制电流I,垂直方向施加磁感应强度为B的匀强磁场,d为半导体材料的厚度,k为霍尔常数,它与半导体材质有关,则在垂直于电流和磁场的方向上,将产生电势差为UH的霍尔电压,它们之间的关系为。霍尔元件。

weixin_48867130的博客 1万+

YOLO11实战:手把手教你优化钢材表面缺陷识别模型(基于NEU-DET数据集)

本文详细介绍了如何使用YOLO11优化钢材表面缺陷识别模型,基于NEU-DET数据集进行实战训练。从数据增强、模型架构优化到训练过程控制,全面解析提升钢材缺陷检测性能的关键技术,特别针对裂纹、划痕等典型缺陷提出针对性解决方案。

weixin_29081163的博客 380

lombok提示找不到符号的问题

lombok编译报错

ZULJ131的博客 1881

maxwell 平面变压器仿真(一)

在学习开关电源设计的时候,我们难免要设计变压器,采用有限元仿真软件MAXWELL 可以帮助我们确定变压器的励磁电感,漏感等参数。对于我们的理论分析大有裨益。但是苦于这破软件的教程真的是相当的零散,我相信大家用起来也总是苦于没有系统的教程指导,撰写本文的目的有两个,一个是记录自己使用的一些问题,一个是给大家提供一个可以参考的文档。

qq_45405656的博客 8249

mapstruct 对象转换,属性为null

mapstruct 对象转换,属性为null

DAX的个人博客 4786

给STM32F4装上耳朵:用麦克风模块和Keil MDK实现你的第一个语音指令(附完整代码)

本文详细介绍了如何使用STM32F4开发板和麦克风模块实现简单的语音指令识别系统。通过Keil MDK开发环境配置、ADC音频采样、语音活动检测和模板匹配算法,开发者可以快速构建响应'开灯'、'关灯'等基础指令的语音交互方案。文章包含完整代码实现和调试技巧,特别适合STM32初学者入门语音识别领域。

weixin_29171087的博客 435

QT实现ftp服务器(附完整源码)

QT实现ftp服务器(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1784

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

YOLO26 标签分配机制:STAL 小目标感知分配策略

YOLO26提出的STAL标签分配策略通过尺度感知机制优化了小目标检测性能。该方法根据目标面积将检测对象分为小、中、大三类,分别采用差异化的分配参数(TopK数量、IoU阈值和中心度权重),特别是对小目标采用更宽松的匹配条件和更高的中心度权重。实验结果表明,STAL策略显著提升了小目标检测精度(AP_small),同时保持了整体检测性能(mAP),为解决目标检测中尺度不平衡问题提供了有效方案。

一键难忘的博客 790

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

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

Meta39的博客 1309

【IoT】压力式电子脉搏器设计

智能硬件

产品线负责人 1621

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

shang_an_1的博客 2257

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...

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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、付费专栏及课程。

余额充值