使用@MappedSuperclass自定义AuditorAware getCurrentAuditor

时间:2019-07-08 16:43:10

标签: java spring-boot spring-data

我正在尝试将自定义值加载到我的@CreatedBy实体的AuditFields字段中。每当我发出POST请求时,我都希望Spring Data Rest使用此AuditorAwareImpl并将TestPrincipal字符串传递到@CreatedBy字段。

我实际上得到的结果是409 Conflict, SQL Constraint created_by is null

BaseEntity需要使用@MappedSuperclass,但我认为它需要@Entity的功能才能将值传递给@CreatedBy

这里的任何指针将不胜感激。

AuditEntity

@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();

    ...
    ...

}

BaseEntity

@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");
            }
        };
    }
}

1 个答案:

答案 0 :(得分:0)

这里的窍门是,print (consec_group) 2019-07-01 20 2019-07-02 24 2019-07-03 24 2019-07-04 24 2019-07-05 24 2019-07-06 8 2019-07-07 21 2019-07-08 0 2019-07-09 24 Freq: D, dtype: int64 @CreatedBy实体中如果没有一些额外的工作就无法工作。

我拼凑了一些不同的教程,结果是我将@Embedded放在了@EntityListener中,并编写了一个使用MyEntity的自定义侦听器类。然后,您可以通过添加嵌入@PrePost等的BaseEntity来进一步构建它。

AuditEntity

AuditEntity

MyEntity

@Embeddable
@Data
public class AuditEntity {
    @Column(name="CREATED_BY")
    @CreatedBy
    private String createdBy;

    // additional fields ...

}

CustomAuditListener

@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;
}