通过抽象基类 + `@jsonignore` 统一屏蔽 `createdby`、`createddate`

在 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⚠️ 注意事项:
该方案真正实现了“一次定义、处处生效”,兼顾可维护性与性能,是中大型 Spring Boot 项目处理审计字段响应过滤的最佳实践。