Elasticsearch Auditing

Preparing entities

为了让审计代码能够确定一个实体实例是否为新实例,该实体必须实现以下定义的 Persistable<ID> 接口:

package org.springframework.data.domain;

import org.springframework.lang.Nullable;

public interface Persistable<ID> {
    @Nullable
    ID getId();

    boolean isNew();
}

由于 Id 的存在还不足以确定 Elasticsearch 中的实体是否为新实体,因此需要更多信息。一种方法是对此决定使用与创建相关的审计字段:

一个 Person 实体可能如下所示 - 省略取值器和设置器方法以简化:

@Document(indexName = "person")
public class Person implements Persistable<Long> {
    @Id private Long id;
    private String lastName;
    private String firstName;
    @CreatedDate
    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Instant createdDate;
    @CreatedBy
    private String createdBy
    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    @LastModifiedDate
    private Instant lastModifiedDate;
    @LastModifiedBy
    private String lastModifiedBy;

    public Long getId() {                                                 (1)
        return id;
    }

    @Override
    public boolean isNew() {
        return id == null || (createdDate == null && createdBy == null);  (2)
    }
}
1 getter 是接口的必需实现
2 如果对象既没有 id,或者不包含创建属性的字段未设置,则该对象为新对象。

Activating auditing

设置实体并提供 AuditorAwareReactiveAuditorAware 后,必须通过在某个配置类中设置 @EnableElasticsearchAuditing 来激活审计:

@Configuration
@EnableElasticsearchRepositories
@EnableElasticsearchAuditing
class MyConfiguration {
   // configuration code
}

使用 reactive 堆栈时,必须执行此步骤:

@Configuration
@EnableReactiveElasticsearchRepositories
@EnableReactiveElasticsearchAuditing
class MyConfiguration {
   // configuration code
}

如果代码为不同类型包含多个 AuditorAware Bean,则必须提供 Bean 的名称,作为 @EnableElasticsearchAuditing 注释的 auditorAwareRef 参数的参数。