Search code examples
javaspringelasticsearchspring-data-elasticsearchauditing

Annotation based Auditing for spring-data-elasticsearch?


I am trying to use the annotation based approach to audit my elasticsearch document using spring-data-elasticsearch. I followed the JPA guide while implementing my classes/setup.

My code looks like this:

@Configuration
@EnableJpaAuditing
public class SpringSecurityAuditorAwareConfiguration {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return new SpringSecurityAuditorAware();
    }

}

public class SpringSecurityAuditorAware implements AuditorAware<String> {

    public Optional<String> getCurrentAuditor() {

        return Optional.ofNullable(SecurityContextHolder.getContext())
                .map(SecurityContext::getAuthentication)
                .filter(Authentication::isAuthenticated)
                .map(Authentication::getPrincipal)
                .map(User.class::cast)
                .map(User::getUsername);
    }
}

@Document(indexName =  "myEntity", type = "myEntityType")
public class MyEntity {

    @Id
    private String id;

    @CreatedBy
    protected String createdBy;

    @CreatedDate
    protected OffsetDateTime createdDate;

    @LastModifiedBy
    protected String lastModifiedBy;

    @LastModifiedDate
    protected OffsetDateTime lastModifiedDate;

    public void setDictionaryId(DictionaryId dictionaryId) {
        this.dictionaryId = dictionaryId;
    }

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public OffsetDateTime getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(OffsetDateTime createdDate) {
        this.createdDate = createdDate;
    }

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public OffsetDateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(OffsetDateTime lastModifiedDate)     {
        this.lastModifiedDate = lastModifiedDate;
    }

}

Unfortunately it when I save a new instance the properties are always set to null. Does spring-data-elasticsearch support the annotation based approach?


Solution

  • Edit:

    This is implemented since version 4.0 which has been released in May 2020.

    Original answer:

    No, this is currently not supported in Spring Data Elasticsearch.

    Please create a ticket to add support for this, this is definitely a feature worth to have.