首页 > 解决方案 > 使用 @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");
            }
        };
    }
}

标签: javaspring-bootspring-data

解决方案


这里的诀窍是,如果没有一些额外的工作,@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  

}

推荐阅读