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

lombok与mapstruct冲突的问题

现象
在生成的mapper方法中,没有调用实体类的getter和setter
ebaee674a421ffad5b74f3872192c28f

解决方案

配置plugin时需要加入lombok-mapstruct-binding依赖

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>${java.version}</source><target>${java.version}</target><encoding>${project.build.sourceEncoding}</encoding><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>

原因分析
lombok基于AST(抽象语法树)修改实现。
mapstruct基于生成代码文件实现。
实体类中使用了lombok注解,mapstruct需要在lombok的AST(抽象语法树)修改完成之后生成代码文件才行。
lombok-mapstruct-binding定义了事件通知器,在lombok修改完成后才会开始执行mapstruct的处理。
代码分析

class NotifierHider {public static class AstModificationNotifier implements AstModifyingAnnotationProcessor {private static Field lombokInvoked;//该方法判断lombok的处理是否完成@Override public boolean isTypeComplete(TypeMirror type) {if (System.getProperty("lombok.disable") != null) return true;return isLombokInvoked();}private static boolean isLombokInvoked() {if (lombokInvoked != null) {try {return lombokInvoked.getBoolean(null);} catch (Exception e) {}return true;}try {Class<?> data = Class.forName("lombok.launch.AnnotationProcessorHider$AstModificationNotifierData");lombokInvoked = data.getField("lombokInvoked");return lombokInvoked.getBoolean(null);} catch (Exception e) {}return true;}}
}

在mapstruct 注解解析器生成mapper代码时会调用org.mapstruct.ap.internal.model.common.TypeFactory#canBeProcessed
来判断lombok是否处理完成,如果未处理完成会抛出TypeHierarchyErroneousException异常,代码如下:

if ( !canBeProcessed( mirror ) ) {throw new TypeHierarchyErroneousException( mirror );
}

在代码外层捕获到这个异常后会进行如下操作:

try {//省略,处理mapper代码的生成
}
catch ( TypeHierarchyErroneousException thie ) {TypeMirror erroneousType = thie.getType();Element erroneousElement = erroneousType != null ? roundContext.getAnnotationProcessorContext().getTypeUtils().asElement( erroneousType ) : null;if ( options.isVerbose() ) {processingEnv.getMessager().printMessage(Kind.NOTE, "MapStruct: referred types not available (yet), deferring mapper: "+ mapperElement );}deferredMappers.add( new DeferredMapper( mapperElement, erroneousElement ) );
}

将未处理的mapper放入deferredMappers集合中,在processor的下一轮process时会处理deferredMappers中的元素。

http://www.zskr.cn/news/7973.html

相关文章:

  • SAP物料自动记账科目设置总结
  • NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控一站式建设方案
  • 移远模组使用移远云平台对接指令
  • 2025年最火的免费客服系统分享
  • MCP服务自用
  • Nexpose 8.21.0 for Linux Windows - 漏洞扫描
  • 天上的乌云不见了,但是没有下雨,那它们都去哪了呢?
  • afx100.dll afrvidwindowmanager.dll afresu.dll afrcomputeserver.dll afckernel.dll aexplore_view. - 详解
  • UE5 增量 Cook
  • 【数据库强大的系统Trip 第1站】总概
  • RenderPass与 SubPass 理论
  • 详细介绍:html让该元素忽略所有鼠标事件,例如点击、悬停、拖拽都无效。
  • 梗棋
  • javax.imageio.IIOException: Cant create output stream! 解决方法 验证码出不来
  • 【转载】在Vue3中引用Vue2组件
  • Windows Server 2016 中文版、英文版下载 (2025 年 9 月更新)
  • 美联储降息 25 个基点,这事儿跟我们有多大关系?
  • Windows Server 2022 中文版、英文版下载 (2025 年 9 月更新)
  • k8s系列--前世今生
  • excel文本改为数据格式
  • 面向对象初步接触-学生信息管理系统
  • Numpy高维数组的索引()
  • Machine Learning
  • 详细介绍:jQuery 操作指南:从 DOM 操作到 AJAX
  • Word 常用快捷键大全:提升文档处理效率的必备技巧​ - 教程
  • ArcGIS:如何设置地图文档的相对路径或者发布为地图包 - 实践
  • 一个 Blazor/WinForm 开发者的 WPF 学习记:通往 Avalonia 的那条路
  • US$35 Yanhua Mini ACDP Module8 BMW FRM Footwell Module
  • 绕过文件上传限制实现客户端路径遍历漏洞利用的技术解析
  • Markdown Day04