mapStruct 使用踩坑指南

一、缓存机制

经常因为变更字段(通常会这样),导致启动失败。需要清理生成的文件。

css 复制代码
/Users/uzong/IdeaProjects/uzong-crm/uzong-crm-manager/src/main/java/com/uzong/crm/manager/GroupManager.java:14:67
java: 找不到符号
  符号:   方法 getId()
  位置: 类型为com.uzong.crm.infra.database.idto.customerIdTO的变量 existsGroup

如果是 maven 管理。需要执行 maven clean

如果使用热部署插件,执行重新加载的时候,也需要执行 maven clean ,让缓存失效。

二、基础类型定制方法慎用

基础类型定义了一个特殊方法。当 customerId(long) 为0的时候,转换成null。

javascript 复制代码
default String mapCustomerId(Long customerId) {
    return customerId != null && customerId != 0L ? String.valueOf(customerId) : null;
}

然后在 mapping 中使用

less 复制代码
@Mappings({
        @Mapping(target = "customerId", expression = "java(mapCustomerId(mdto.getcustomerId()))")
})
CustomerVO mdtoToVO(CustomerMDTO mdto);

最终效果:

所有 Long 类型的字段,都采用了这个方法。影响面被大大扩大!

比如:long 类型在执行映射的时候也采用了这个方法

less 复制代码
customerVO.setId( mapCustomerId( mdto.getId() ) );

三、Long类型默认值 0

scss 复制代码
CustomerCreateParam createRequestToParam(CustomerCreateRequest request);
@Mappings({
        @Mapping(source = "customerId", target = "customerId", defaultValue = "0L")
})
CustomerUpdateParam updateRequestToParam(CustomerUpdateRequest request);

会生成代码:

kotlin 复制代码
Long.parseLong( request.getcustomerId() )

但执行代码会报错

php 复制代码
Exception in thread "main" java.lang.NumberFormatException: For input string: "0L"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Long.parseLong(Long.java:589)
        at java.lang.Long.parseLong(Long.java:631)

如果设置 0,编译通不过!

arduino 复制代码
/Users/uzong/IdeaProjects/uzong-crm/uzong-crm-web/src/main/java/com/uzong/crm/web/converter/CustomerEndPointConverter.java:56:25
java: Can't map "0" to "Long customerId". Reason: L/l mandatory for long types.

目前是踩过的一些坑,后续可以继续补充。

相关推荐
ps酷教程7 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云7 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
为思念酝酿的痛7 小时前
POSIX信号量
linux·运维·服务器·后端
小羊在睡觉7 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
_日拱一卒8 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
swipe8 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
隔窗听雨眠8 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨9 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝9 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区9 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展