使用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版,Jackson将认将getFullName()方法序列化,并在“ ElasticSearch”索引中填充“ fullName”字段。在版本4.x中,此信息从我们的索引中删除。 4.x中的注释似乎仅支持字段的序列化选项,而不支持方法。杰克逊注释(例如@JsonInclude)显然在这里不再起作用。

如何使用Spring Data ElasticSearch 4.x将方法结果映射到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将为此文本属性提供的默认映射感到满意,就是这样。

我认为应该可以在不使用setter的情况下使用此方法,此外,应该可以在方法上放置@Field批注,以便能够对此类属性进行适当的映射。

我为此created a Jira issue