
通过抽象基类 + `@jsonignore` 统一屏蔽 `createdby`、`createddate` 等审计字段,避免在每个实体中重复添加注解,实现零侵入、可复用的 api 响应净化。
在 Spring Boot 项目中启用 JPA Auditing(如 @CreatedBy、@CreatedDate)后,审计字段会自动写入数据库,但默认也会被 Jackson 序列化到 REST API 响应中——这往往不符合前端需求,既暴露了内部结构,又增加了无效数据传输。若为数十个实体逐一添加 @JsonIgnore 或 @JsonIgnoreProperties,不仅冗余,还违背 DRY 原则。
推荐方案:基于 @MappedSuperclass 的统一审计基类
定义一个抽象父类(如 AuditableEntity),集中声明所有审计字段,并直接应用 @JsonIgnore,让所有业务实体继承它。这样只需一处配置,全局生效:
@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class AuditableEntity : Serializable {
companion object {
private const val serialVersionUID = 872345678901234L
}
@Column(updatable = false)
@CreatedDate
@JsonIgnore
var createdAt: LocalDateTime? = null
@Column(updatable = false)
@CreatedBy
@JsonIgnore
var createdBy: String? = null
@Column
@LastModifiedDate
@JsonIgnore
var updatedAt: LocalDateTime? = null
@Column
@LastModifiedBy
@JsonIgnore
var updatedBy: String? = null
// 可选:提供格式化后的只读属性(不参与持久化)
val createdAtStr: String
get() = createdAt?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ?: ""
val updatedAtStr: String
get() = updatedAt?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ?: ""
}✅ 使用方式(子实体无需额外注解):
@Entity
data class User(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
var username: String = "",
var email: String = ""
) : AuditableEntity() // 自动继承审计字段及 @JsonIgnore⚠️ 注意事项:
- 确保已启用 JPA Auditing:在主配置类上添加 @EnableJpaAuditing;
- @JsonIgnore 作用于字段而非 getter,因此需确保 Jackson 使用字段访问策略(Spring Boot 2.6+ 默认开启 spring.jackson.visibility.field=ANY;若自定义了 visibility,需确认兼容);
- 若需在特定接口中临时启用审计字段(如管理后台),可用 @JsonInclude(JsonInclude.Include.NON_NULL) 配合 DTO 手动映射,避免污染通用响应;
- 时间类型建议统一使用 LocalDateTime(推荐)或 Instant,避免 Date 的时区歧义与序列化兼容性问题。
该方案真正实现了“一次定义、处处生效”,兼顾可维护性与性能,是中大型 Spring Boot 项目处理审计字段响应过滤的最佳实践。








