Spring Boot中如何用MapStruct映射请求对象并处理createdAt/updatedAt
解决MapStruct映射时createdAt/updatedAt字段的处理问题
你的做法其实是可行的,但结合JPA的回调机制,还有更简洁的实现方式,完全不需要手动处理这两个字段:
核心逻辑
你的BaseEntity已经通过@PrePersist和@PreUpdate注解实现了字段自动维护:
@PrePersist会在实体首次存入数据库时,自动把createdAt设为当前时间@PreUpdate会在实体更新操作触发时,自动刷新updatedAt为当前时间
这两个字段的维护完全由JPA接管,MapStruct不需要参与任何映射操作。
优化后的UserMapper
因为UserRequest里根本没有createdAt和updatedAt属性,MapStruct默认会忽略源对象不存在对应属性的目标字段,所以你可以直接删掉这两行ignore配置,代码更简洁:
@Mapper(componentModel = "spring") public interface UserMapper { @Mapping(target = "id", ignore = true) void updateRequestToUser(UserRequest request, @MappingTarget User user); }
为什么不用手动加ignore?
MapStruct的映射规则是:只有源对象存在与目标字段同名的属性时,才会自动赋值。如果源对象没有对应属性,MapStruct不会修改目标字段的原有值——这正好契合我们的需求:
createdAt在更新操作中要保留创建时的原始值,不能被改动updatedAt交给JPA的@PreUpdate自动更新,不需要MapStruct干预
额外提醒
id字段的ignore = true是必须保留的:更新操作中实体的ID应该由数据库或现有实例保持,不能被请求对象的ID覆盖(除非你有明确的业务需求,但通常更新时ID是从路径或上下文获取,不会从请求体传入)。
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

