mapstruct 部分字段不生成的问题

文章讨论了在开发过程中,使用MapStruct自动生成代码时遇到的问题,特别是当类上的属性名称带有add前缀时,与@Builder注解冲突,解决方法包括移除@Builder或修改属性名称。

开发的时候遇到的坑。

有一个字段:addAmount

类上使用了@Builder注解

使用mapstruct自动生成代码

属性名称带add前缀则会不生成,要么去掉@Builder,要么把属性名add改了。可能跟关键字有关。

### MapStruct 字段生效的原因分析 当使用 MapStruct 进行对象映射时,如果字段未能正常工作,通常是因为编译后的文件未被更。具体来说,在开发环境中,IDE(如 IntelliJ IDEA)会自动清理 `target` 目录下的旧编译文件[^4]。 ### 清理目标目录并重构建项目 为了使字段能够正确映射,建议执行以下操作: 1. **手动清除编译缓存** 执行 Maven 或 Gradle 的 clean 命令来彻底移除之前的编译产物。 对于 Maven 用户: ```bash mvn clean install ``` 对于 Gradle 用户: ```bash gradle clean build ``` 2. **验证映射关系** 确保 DTO 和实体之间的映射定义准确无误。例如,假设有一个简单的用户模型及其数据传输对象 (DTO),其中包含同的属性名称: ```java // 实体 @Data @NoArgsConstructor @AllArgsConstructor public class User { private int id; private String name; } // 数据传输对象 @Data @NoArgsConstructor @AllArgsConstructor public class UserDTO { private int userId; // 映射自id private String userName; // 映射自name } ``` 此时可以利用 MapStruct 定义如下接口来进行两者间的转换: ```java @Mapper(componentModel = "spring") public interface UserMapper { @Mapping(source = "id", target = "userId") @Mapping(source = "name", target = "userName") UserDTO userToUserDto(User user); List<UserDTO> usersToUsersDtos(List<User> users); } ``` 通过上述方式指定源与目的字段间的关系,可有效处理同命名约定的情况[^2]。 3. **启用调试模式查看生成代码** 有时了解实际生成的 Mapper 接口实现有助于排查问题所在。可以在 pom.xml 中开启 debug 输出选项以便观察最终产生的 Java 文件内容。 ```xml <configuration> <debug>true</debug> </configuration> ``` 这一步骤能帮助确认是否确实存在针对最版本 POJOs 自动生成方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值