You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Mapstruct中全局忽略POJO的特定字段映射?

解决MapStruct自动忽略审计字段的方案

针对你提到的实体继承结构(BaseEntity/UpdatableEntity + @SuperBuilder),要让MapStruct全局忽略createdBy、createdAt、modifiedBy、modifiedAt这几个审计字段,无需在每个Mapper方法重复写@Mapping(target = ..., ignore = true),有两种高效方案可选:

方案一:全局映射配置类(无需修改实体)

MapStruct 1.3及以上版本支持通过@MappingConfig定义全局映射规则,一次性指定忽略的字段,所有Mapper继承该配置即可生效:

  1. 创建全局配置接口
import org.mapstruct.BeanMapping;
import org.mapstruct.MappingConfig;

@MappingConfig
public interface AuditFieldIgnoreConfig {
    @BeanMapping(ignoredProperties = {"createdBy", "createdAt", "modifiedBy", "modifiedAt"})
    default void defaultAuditFieldIgnore() {}
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:55:17