java - 使用 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 中的字段?
解决方案
您可以通过将带有参数的@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 问题。
推荐阅读
- redis - 如何删除存储在给定 Redis 集中的 Redis 键?
- javascript - 相机反应原生错误“null不是对象”
- wordpress - 更新元数据而不删除先前的值
- flutter - image_picker 插件导致 Android 的构建错误
- linux - 自动下载最新版本的 Slack
- jquery - FullCalendar 上带有设计的工具提示
- c++ - 卡在使用结构向量
- python - 我需要使用beautifulsoup python从没有内部标签数据的类标签中检索数据
- c++ - (重新)在cpp中初始化没有复制构造函数的对象
- laravel - Laravel 5.6:如何使用一个文件夹中包含的所有模型