java - 使用 @MappedSuperclass 自定义 AuditorAware getCurrentAuditor
问题描述
我正在尝试将自定义值加载到我的实体中的@CreatedBy
字段中。AuditFields
每当我提出POST
请求时,我都希望 Spring Data Rest 使用它AuditorAwareImpl
并将TestPrincipal
字符串传递给@CreatedBy
字段。
我实际得到的结果是409 Conflict, SQL Constraint created_by is null
.
BaseEntity
需要使用,@MappedSuperclass
但我认为它需要的功能@Entity
才能将值传递给@CreatedBy
?
这里的任何指针将不胜感激。
审计实体
@Embeddable
@Access(AccessType.FIELD)
@Data
@EntityListeners(AuditingEntityListener.class)
public class AuditFields implements Serializable {
@CreatedBy
@Column(name="CREATED_BY", length=256)
private String createdBy;
@Column(name="CREATED_TIMESTAMP")
private LocalDateTime createTimestamp = LocalDateTime.now();
...
...
}
基础实体
@MappedSuperclass
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class BaseEntity implements Serializable {
@Column(name="RECORD_STATUS_CODE", length=1)
@EqualsAndHashCode.Exclude
private String myStatus;
@Version
@Column(name="VERSION_NUMBER")
@Setter(AccessLevel.PROTECTED)
@EqualsAndHashCode.Exclude
private Long versionNumber;
@Embedded
@EqualsAndHashCode.Exclude
private AuditEntity auditFields;
}
AuditorAwareImpl
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class AuditorAwareImpl {
@Bean
public AuditorAware<String> auditorProvider() {
return new AuditorAware<String>() {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of("TestPrincipal");
}
};
}
}
解决方案
这里的诀窍是,如果没有一些额外的工作,@CreatedBy
它在@Embedded
实体中不起作用。
@EntityListener
我拼凑了几个不同的教程,结果是我MyEntity
把@PrePost
. 然后,您可以通过添加BaseEntity
嵌入AuditEntity
等的 来进一步构建它。
审计实体
@Embeddable
@Data
public class AuditEntity {
@Column(name="CREATED_BY")
@CreatedBy
private String createdBy;
// additional fields ...
}
我的实体
@Data
@Table(name="TABLENAME", schema="SCHEMANAME")
@EntityListeners(CustomAuditListener.class)
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="MY_ID")
private Long myId;
@Embedded
@EqualsAndHashCode.Exclude
private AuditEntity auditFields;
}
自定义审计监听器
public class CustomAuditListener {
@PrePersist
public void prePersist(Object obj) {
MyEntity entity = (MyEntity) obj;
AuditFields audit = new AuditFields();
audit.setCreatedBy("CreatedByValueHere")
entity.setAuditFields(audit);
}
// can add @PreUpdate, etc, here
}
推荐阅读
- python - 将数据框对象转换为 int64 时出错
- elasticsearch - 在 Linux 上增加 Elastic Search 的磁盘分配
- google-cloud-data-fusion - 如何计算 CDAP/DATA Fusion 中的行数?
- python - .Net Core 似乎以大约 1000 / 秒的速度读取 GPIO 引脚。如何走得更快?
- xamarin - Xamarin UI Test Android:如何将应用程序背景放置一段时间,然后在不创建新实例的情况下再次启动它?
- java - 如何向 BigDecimal 添加额外的数字?
- jquery - 在使用 ajax 附加/覆盖 div 之前清除 div
- git - 合并多个拉取请求时发生冲突
- logistic-regression - 我应该对每个构造进行多少次主成分分析?
- reactjs - 如何解决 useEffect 中缺少的依赖关系?