此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Elasticsearch 5.4.0spring-doc.cn

Elasticsearch 审计

准备实体

为了使审计代码能够确定实体实例是否为新实例,实体必须实现定义如下的接口:Persistable<ID>spring-doc.cn

package org.springframework.data.domain;

import org.springframework.lang.Nullable;

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

    boolean isNew();
}

由于 Id 的存在不足以确定 enitity 在 Elasticsearch 中是否是新的,因此需要其他信息。一种方法是将与创建相关的审计字段用于此决策:spring-doc.cn

实体可能如下所示 - 为简洁起见,省略 getter 和 setter 方法:Personspring-doc.cn

@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

激活审计

在设置实体并提供 - 或 - 后,必须通过在配置类上设置 来激活 审计:AuditorAwareReactiveAuditorAware@EnableElasticsearchAuditingspring-doc.cn

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

当使用反应式堆栈时,这必须是:spring-doc.cn

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

如果代码包含多个不同类型的 Bean,则必须提供 Bean 的名称以用作注释参数的参数。AuditorAwareauditorAwareRef@EnableElasticsearchAuditingspring-doc.cn