Пользовательский AuditorAware getCurrentAuditor с @MappedSuperclass - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь загрузить настроенное значение в поле @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 голосов
/ 10 июля 2019

Хитрость в том, что @CreatedBy не работает в @Embedded сущности без дополнительной работы.

Я собрал несколько различных учебных пособий, в результате чего я поместил @EntityListener в свой MyEntity и написал собственный класс слушателя, который использует @PrePost.Затем вы можете создать его еще больше, добавив BaseEntity, который включает AuditEntity и т. Д.

AuditEntity

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

CustomAuditListener

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  

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...