@createddate注解不适用于spring数据elasticsearch

dxxyhpgq  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(506)

我正在使用spring引导数据elasticsearch将文档持久化到elasticsearch中。
下面是我的文档对象。

@Builder
@Document(indexName = "testidx", createIndex = false)
public class Book {
    @Id
    private final String _id;

    @NotNull
    @CreatedDate
    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private final Instant regTime;

    @NotNull
    @Field(type = FieldType.Text)
    private final String bookName;
}

但是,当我将对象保存到elasticsearchrepository中时,regtime(必须由@createddate自动创建和保存)尚未保存。

elasticRepository.save(
            Book.builder()
                .bookName("test")
                .build()
        );
GET /testidx/_search

{
        "_index" : "testidx",
        "_type" : "_doc",
        "_id" : "M3IS_XgBGpcXDVxetXXn",
        "_score" : 1.0,
        "_source" : {
          "_class" : "{test class Name}",
          "bookName" : "test",
        }
      }

你能告诉我错过了什么吗?
我正在研究springboot2.4.5(以及springbootstarter数据elasticsearch 2.4.5)和elasticsearch 7.12.0。

flseospp

flseospp1#

请检查有关审计的文件(https://docs.spring.io/spring-data/elasticsearch/docs/4.2.0/reference/html/#elasticsearch.auditing).
您的实体需要实现 Persistable 接口,需要重新实现 isNew() 方法(见第9.2.1节)。注意:我刚刚在文档实体示例中看到 @CreatedDate 以及 @CreatedBy 缺少注解。我会修改文件,当然需要注解。
那你有吗 @EnableElasticsearchAuditing 在spring启动应用程序或任何其他配置类上?这也是需要的。

gxwragnw

gxwragnw2#

不幸的是,springdataelasticsearch不支持所有与持久性相关的注解,既不支持jpa的所有Map注解,也不支持spring数据的审计注解 @CreatedDate 属于。

解决方案

所以我会放弃它,只使用基本的 @Field 注解。那你的财产呢 regTime 应该在json请求中显示为上面的同级 bookName 并按预期坚持下去。
然而,由于没有spring数据的特殊性 @CreatedDate 注解(便于审计),您必须自己关心初始化,在持久化之前设置值,例如使用 regTime = Instant.now() (在字段定义、构造函数或其他中)。

背景

请参阅6.1.1中有关元模型对象Map的文档。Map注解概述,当前(版本4.2)仅包括以下字段注解: @Id @Field @GeoPoint 另见官方指南8。elasticsearch存储库。
以前,SimpleLasticSearchPersistentProperty中有一个枚举支持的\u id\u属性\u名称,它列出了这些字段注解。
参见类似的问题:SpringDataElasticSearch是否支持jpa中的@id注解?
本教程帮助我介绍了elasticsearch数据:spring boot elastic search示例-java开发人员专区

相关问题