首页 > 解决方案 > 使用 Spring Data ElasticSearch 4.x(没有 Jackson)的基于方法的序列化

问题描述

我们正在运行一个 Java、Spring 应用程序,它使用 Spring Data Elasticsearch 为 ElasticSearch 建立索引。最近我的团队已经从 3.x 版本迁移到 4.x 版本。此升级根据https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.RELEASE/reference/html/#elasticsearch.mapping删除了 Jackson 映射器本文档包含以下引用:

现在使用 MappingElasticsearchConverter 涵盖了所有这些情况。

但是,我还没有找到解决以下问题的方法。我们过去在 ElasticSearch 中通过在我们的模型中包含一个包含该模型字段的逻辑函数的方法来构建某些字段。例如:

public class Person {
  private String firstName;
  private String lastName;

  String getFullName(){
    return firstName  + " " + lastName;
  }
}

使用版本 3.x,getFullName() 方法将由 Jackson 默认序列化,用“fullName”字段填充我们的 ElasticSearch 索引。在版本 4.x 中,我们的索引中省略了此信息。4.x 中的注释似乎只支持字段的序列化选项,而不是方法。Jackson 注释(例如@JsonInclude)显然不再在这里工作了。

如何使用 Spring Data ElasticSearch 4.x 将方法结果映射到 ElasticSearch 中的字段?

标签: javaspringelasticsearchjacksonspring-data-elasticsearch

解决方案


您可以通过将带有参数的@AccessType注释添加到方法中来实现:PROPERTY

import org.springframework.data.annotation.AccessType;

@AccessType(AccessType.Type.PROPERTY)
String getFullName(){
  return firstName  + " " + lastName;
}

请注意,Spring Data Elasticsearch 也需要一个 setter,因此您需要定义一个空方法:

void setFullName(String ignore){}

如果您对 Elasticsearch 将为该文本属性提供的默认映射感到满意,那就可以了。

我认为应该可以在没有设置器的情况下使用它,除此之外,应该可以将@Field注释放在方法上,以便能够为这些属性进行适当的映射。

我为此创建了一个 Jira 问题


推荐阅读