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

Spring Boot序列化前如何自动清空Auditable类的审计字段?

问题描述

我有大量继承自Auditable抽象类的业务类,之前需要手动隐藏所有对象的审计字段,因此编写了Auditable类并实现clear()方法用于清空审计字段:

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public abstract class Auditable {
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = CREATED_DATE_COLUMN, columnDefinition = TIMESTAMP_WITH_ZONE)
    private Date createdDate;

    @Column(name = CREATED_BY_COLUMN)
    private String createdBy;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = LAST_UPDATED_DATE_COLUMN, columnDefinition = TIMESTAMP_WITH_ZONE)
    private Date lastUpdatedDate;

    @Column(name = LAST_UPDATED_BY_COLUMN)
    private String lastUpdatedBy;

    public void clear() {
        this.createdDate = null;
        this.createdBy = null;
        this.lastUpdatedDate = null;
        this.lastUpdatedBy = null;
    }
}

业务类示例(如Product):

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Table(name = "products")
public class Product extends Auditable {
    // 业务字段定义...
}

我尝试重写Auditable的序列化方法,期望在序列化前自动调用clear()但未成功,请问该如何实现?

解决方案

方法1:使用@JsonBeforeSerialize注解(最简方案)

直接在clear()方法上添加@JsonBeforeSerialize注解,Jackson会在序列化对象前自动执行该方法,无需额外编写序列化器:

修改Auditable类的clear()方法:

@JsonBeforeSerialize
public void clear() {
    this.createdDate = null;
    this.createdBy = null;
    this.lastUpdatedDate = null;
    this.lastUpdatedBy = null;
}

此方法无需修改业务类,所有继承Auditable的子类都会自动生效。

方法2:自定义序列化器并指定

如果需要更灵活的序列化逻辑,可以自定义序列化器,在其中调用clear():

  1. 实现自定义序列化器:
public class AuditableSerializer extends JsonSerializer<Auditable> {
    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void serialize(Auditable value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 序列化前清空审计字段
        value.clear();
        // 复用默认序列化逻辑处理剩余字段
        objectMapper.writeValue(gen, value);
    }
}
  1. 在Auditable类上添加@JsonSerialize注解指定序列化器:
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonSerialize(using = AuditableSerializer.class)
public abstract class Auditable {
    // 原有字段与方法...
}

方法3:使用Jackson Mixin(无侵入式修改)

若不想修改Auditable原代码,可通过Mixin注入序列化前的逻辑:

  1. 创建Mixin类:
public abstract class AuditableMixin {
    @JsonBeforeSerialize
    abstract void clear();
}
  1. 将Mixin注册到ObjectMapper:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Auditable.class, AuditableMixin.class);

此方式不会改动原有类的代码,所有继承Auditable的类序列化时都会自动触发clear()方法。


内容的提问来源于stack exchange,提问作者Alper İnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:13:20