我正在尝试将自定义值加载到我的 AuditFields
实体中的 @CreatedBy
字段中。每当我发出 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 的自定义监听器类
。然后,您可以通过添加嵌入 AuditEntity
等的 BaseEntity
来进一步构建它。
审计实体
@Embeddable
@Data
public class AuditEntity {
@Column(name="CREATED_BY")
@CreatedBy
private String createdBy;
// additional fields ...
}
MyEntity
@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
}
关于java - 带有 @MappedSuperclass 的自定义 AuditorAware getCurrentAuditor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56939296/