
本文介绍如何在 spring boot 项目中通过抽象基类 + `@jsonignore` 实现审计字段(如 createdby、createddate)的全局序列化屏蔽,避免在每个实体类中重复添加注解,提升代码复用性与可维护性。
在构建 RESTful API 时,JPA 审计功能(如 @CreatedBy、@CreatedDate)极大简化了元数据管理,但这些字段通常不应暴露在 API 响应中——既涉及数据安全(如用户 ID 泄露),也违背接口契约的简洁性原则。若为数十个实体逐一添加 @JsonIgnore 或 @JsonIgnoreProperties,不仅冗余,还易遗漏、难维护。
一个高效且符合 DRY 原则的解决方案是:定义统一的审计基类,集中声明并屏蔽审计字段。
✅ 推荐实现:@MappedSuperclass + @JsonIgnore 全局控制
使用 @MappedSuperclass 定义抽象父类,将所有公共审计字段及其 Jackson 序列化控制逻辑内聚于此。所有业务实体继承该类后,自动获得审计能力与响应屏蔽能力:
@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class AuditableEntity : Serializable {
companion object {
private const val serialVersionUID = -5554308939380869754L
}
@Column(name = "created_at", updatable = false)
@CreationTimestamp
@JsonIgnore // ← 关键:统一屏蔽,不参与 JSON 序列化
var createdAt: LocalDateTime? = null
@Column(name = "created_by", updatable = false)
@CreatedBy
@JsonIgnore
var createdBy: String? = null
@Column(name = "updated_at")
@UpdateTimestamp
@JsonIgnore
var updatedAt: LocalDateTime? = null
@Column(name = "updated_by")
@LastModifiedBy
@JsonIgnore
var updatedBy: String? = null
// 可选:提供友好格式化的时间字符串(仅用于读取,不映射数据库)
val createdAtStr: String
get() = createdAt?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) ?: ""
val updatedAtStr: String
get() = updatedAt?.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")) ?: ""
}随后,您的业务实体只需简单继承即可:
@Entity
@Table(name = "users")
class User : AuditableEntity() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
@Column(name = "username", nullable = false)
var username: String? = null
@Column(name = "email")
var email: String? = null
}✅ 效果验证:调用 GET /api/users/1 时,响应 JSON 中将完全不包含 createdAt、createdBy 等字段,无需任何额外配置。
⚠️ 注意事项与增强建议
- 确保启用 JPA Auditing:在主配置类或启动类上添加 @EnableJpaAuditing,并配置 AuditorAware Bean;
- 时间类型推荐 LocalDateTime:相比 Date,它更符合现代 Java 时间 API,且与数据库 TIMESTAMP 映射更自然(需确认 JDBC 驱动支持);
- 如需部分场景暴露审计信息(如管理后台),可结合 @JsonView 或自定义序列化器实现条件化输出,而非全局屏蔽;
- 避免在基类中使用 @JsonIgnoreProperties:它作用于整个类,粒度粗且无法与 @JsonIgnore 共存;@JsonIgnore 字段级控制更精准、可继承、易调试;
- 数据库字段命名建议统一加前缀/后缀(如 _at, _by),便于 SQL 审计追踪,也利于团队规范。
通过这一设计,您不仅消除了重复注解,更将审计生命周期管理(存储)与表现层关注点(序列化)清晰分离,真正践行了关注点分离(SoC)与开闭原则(OCP)——新增实体只需继承,无需修改序列化逻辑。










