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():
- 实现自定义序列化器:
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); } }
- 在
Auditable类上添加@JsonSerialize注解指定序列化器:
@Data @AllArgsConstructor @NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_NULL) @JsonSerialize(using = AuditableSerializer.class) public abstract class Auditable { // 原有字段与方法... }
方法3:使用Jackson Mixin(无侵入式修改)
若不想修改Auditable原代码,可通过Mixin注入序列化前的逻辑:
- 创建Mixin类:
public abstract class AuditableMixin { @JsonBeforeSerialize abstract void clear(); }
- 将Mixin注册到
ObjectMapper:
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.addMixIn(Auditable.class, AuditableMixin.class);
此方式不会改动原有类的代码,所有继承Auditable的类序列化时都会自动触发clear()方法。
内容的提问来源于stack exchange,提问作者Alper İnan
相关产品推荐
相关产品推荐

