如何在Mapstruct中全局忽略POJO的特定字段映射?
解决MapStruct自动忽略审计字段的方案
针对你提到的实体继承结构(BaseEntity/UpdatableEntity + @SuperBuilder),要让MapStruct全局忽略createdBy、createdAt、modifiedBy、modifiedAt这几个审计字段,无需在每个Mapper方法重复写@Mapping(target = ..., ignore = true),有两种高效方案可选:
方案一:全局映射配置类(无需修改实体)
MapStruct 1.3及以上版本支持通过@MappingConfig定义全局映射规则,一次性指定忽略的字段,所有Mapper继承该配置即可生效:
- 创建全局配置接口
import org.mapstruct.BeanMapping; import org.mapstruct.MappingConfig; @MappingConfig public interface AuditFieldIgnoreConfig { @BeanMapping(ignoredProperties = {"createdBy", "createdAt", "modifiedBy", "modifiedAt"}) default void defaultAuditFieldIgnore() {} }
- 在Mapper接口中引用该配置
import org.mapstruct.Mapper; @Mapper(config = AuditFieldIgnoreConfig.class) public interface UserMapper { // 这里的所有映射方法都会自动忽略那四个审计字段,无需额外注解 UserEntity toEntity(UserDto dto); }
这个方案的优势是无需改动实体代码,所有忽略规则集中管理,后续要调整忽略字段只需修改配置类即可。
方案二:在父类字段上标记@Ignore(实体层面配置)
如果你希望直接在实体层面标记忽略字段,可以在BaseEntity和UpdatableEntity的对应字段上添加MapStruct的@Ignore注解:
import org.mapstruct.Ignore; import lombok.Getter; import lombok.Setter; import lombok.SuperBuilder; @Getter @Setter @SuperBuilder public abstract class BaseEntity { @Ignore private String createdBy; @Ignore private LocalDateTime createdAt; }
import org.mapstruct.Ignore; import lombok.Getter; import lombok.Setter; import lombok.SuperBuilder; @Getter @Setter @SuperBuilder public abstract class UpdatableEntity extends BaseEntity { @Ignore private String modifiedBy; @Ignore private LocalDateTime modifiedAt; }
这样所有继承这两个父类的实体,在MapStruct映射时都会自动忽略这些字段,无需在Mapper中做任何配置。这个方案的优势是规则与实体绑定,直观明了,但需要修改实体类代码。
注意事项
- 两种方案都兼容Lombok的
@SuperBuilder,MapStruct会自动识别并生成基于Builder的映射代码,不会影响Hibernate自动生成审计字段的逻辑。 - 若使用全局配置类,确保你的MapStruct版本≥1.3,早期版本不支持
@BeanMapping的全局ignoredProperties配置。
内容的提问来源于stack exchange,提问作者keemahs
相关产品推荐
相关产品推荐

