MapStruct自定义注解消除重复@Mapping忽略审计字段
本文介绍如何通过自定义复合注解(如 @ignoreauditmapping)统一管理 createdat、updatedat、createdby、modifiedby 等通用审计字段的忽略逻辑,避免在多个 mapstruct 映射方法中重复书写冗长的 @mapping(ignore = true) 声明,从而显著提升代码的可维护性与可读性。
在实际的 Spring 商业项目中,实体类常常包含 createdAt、updatedAt、createdBy、modifiedBy 等审计字段。这些字段通常由 JPA 或 Spring Data Audit 自动填充,不应从 DTO 或请求对象反向映射回来。然而,如果每个 @Mapping 方法都手动编写十余行 @Mapping(target = "xxx", ignore = true),代码不仅显得臃肿,还容易因遗漏或拼写错误引发安全漏洞,例如意外覆盖 id 或审计时间字段。
✅ 推荐方案:自定义组合注解(Composed Annotation)
MapStruct 原生支持将多个 @Mapping 注解打包成一个自定义注解——这是目前最简洁、类型安全且对 IDE 最友好的方式。只需定义一次,便可在所有映射方法上复用:
// 审计字段统一忽略注解
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Mapping(target = "createdAt", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "createdBy", ignore = true)
@Mapping(target = "modifiedBy", ignore = true)
public @interface IgnoreAuditMapping {}
⚠️ 注意:该注解必须标注 @Retention(RUNTIME),否则 MapStruct 在运行时无法读取元数据;同时要确保 @Mapping 中的 target 字段名与实际 POJO 属性严格一致,区分大小写,并且支持点号路径,如 "parentCategory.createdAt"。
随后,在 Mapper 接口中直接应用此注解,再根据需求补充其他特殊忽略项即可:
@Mapper(config = MapperConfiguration.class)
public interface CategoryMapper {
CategoryDto toDto(Category category);
@IgnoreAuditMapping
@Mapping(target = "id", ignore = true)
@Mapping(target = "quizzes", ignore = true)
// 支持嵌套路径(自动继承 IgnoreAuditMapping 中的 parentCategory.*)
@Mapping(target = "parentCategory.id", ignore = true)
@Mapping(target = "parentCategory.quizzes", ignore = true)
Category toCategory(CategoryDto categoryDto);
@IgnoreAuditMapping
@Mapping(target = "id", ignore = true)
@Mapping(target = "quizzes", ignore = true)
@Mapping(target = "parentCategory", ignore = true) // 全量忽略 parentCategory 对象
@Mapping(target = "childCategories", ignore = true)
Category toDomain(CategoryCreationRequest request);
}
? 进阶技巧:扩展可复用性
- 如果不同模块的审计字段存在细微差别(例如部分实体还带有 deletedAt 或 version),完全可以定义多组注解:@IgnoreBaseAuditMapping、@IgnoreFullAuditMapping;
- 结合 @InheritConfiguration 实现配置继承,适用于需要差异化处理 target 的场景——例如某些方法需要映射 id 但忽略其余审计字段;
- 配合 MapStruct 的 @MapperConfig 全局配置,统一设置 unmappedTargetPolicy = ReportingPolicy.IGNORE,可以避免未映射字段报错,但这一配置并不替代语义明确的 ignore = true。
✅ 总结
采用自定义组合注解来处理 MapStruct 中审计字段的重复忽略问题,是目前公认的最佳实践——零侵入、零反射开销、完全兼容编译期代码生成,并天然支持 IDE 的自动补全与静态检查。与抽象父接口或手写 @AfterMapping 方法相比,该方案更轻量、直观,也更易于测试和维护。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
列表遍历时动态判断阈值并返回相应文本
遍历数值列表时,先筛选满足阈值的元素,再根据结果输出列表或友好提示。推荐使用列表推导式结合条件判断,注意边界用`>=`,空列表自动为假。也可用`any()`提前终止遍历,提升效率。此法简洁,避免显式循环,特别适合阈值筛选。
Maven项目中如何强制使用本地构建的依赖版本
多模块开发中强制使用本地依赖的正确做法是使用-SNAPSHOT版本并配合`-U`参数强制更新,或重构为多模块项目统一管理生命周期。避免使用版本范围语法或手动复制JAR,确保构建行为可靠可重复。
Go语言net.Conn并发写安全与原子性保障解析
Go标准库中net Conn支持并发方法调用,但Write()不保证原子性。多goroutine同时写入时,系统可能拆分数据包,导致内容交错,破坏消息边界。必须使用互斥锁或bufio Writer等显式同步机制确保写操作完整性,不可依赖系统调用本身的原子性。
Python在Windows系统中获取指定卷标U盘驱动器字母的方法
使用Pythonwmi库通过Win32_Volume接口查询Windows系统中卷标为“TOSHIBA”的U盘盘符。需安装wmi和pywin32,注意大小写区分及多设备过滤。仅适用于Windows。
TP6.0消息已读功能基于Redis Bitmap未读计数方案
TP6 0中使用Redis位图实现消息已读标记,每条消息仅占一个比特,内存效率高。需将消息ID映射为连续偏移量,通过SETBIT和GETBIT操作。需提前维护用户ID到偏移量的映射表,注意键过期与驱动类型(phpredis与predis)问题。此方法内存极省,适合海量消息场景,且需确保偏移量唯一。
- 日榜
- 周榜
- 月榜
相关攻略
2026-07-08 06:50
2026-07-08 06:50
2026-07-08 06:50
2026-07-08 06:49
2026-07-08 06:49
2026-07-08 06:49
2026-07-08 06:49
2026-07-08 06:49
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

