【问题标题】:Method based serialization with Spring Data ElasticSearch 4.x (without Jackson)使用 Spring Data ElasticSearch 4.x(没有 Jackson)的基于方法的序列化
【发布时间】:2020-12-16 07:07:03
【问题描述】:

我们正在运行一个 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 中的字段?

【问题讨论】:

    标签: java spring elasticsearch jackson spring-data-elasticsearch


    【解决方案1】:

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

    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

    【讨论】:

    • 尽管我的第一个答案,有办法让它工作,我相应地更新了我的答案
    猜你喜欢
    • 2016-07-01
    • 2017-07-21
    • 1970-01-01
    • 2020-06-28
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多