【发布时间】:2016-08-14 10:36:27
【问题描述】:
我正在开发一个使用 Spring-boot、关系数据库和 Elasticsearch 的应用程序。
我在代码中的 2 个不同位置使用 JSON 序列化:
- 在 REST API 的响应中。
- 当代码与 Elasticsearch 交互时。
在 Elasticsearch 中有一些我需要但我想对应用程序用户隐藏的属性(例如来自关系数据库的内部 id)。
这是一个实体的例子:
@Document
public class MyElasticsearchEntity {
@Id
private Long id; //I want to hide this to the user.
private String name;
private String description;
}
问题 :当它在 Elasticsearch 中持久化的对象时,它会被序列化为 JSON。因此,带有@JsonIgnore 的字段在序列化到 Elasticsearch 时会被忽略。
到目前为止,我发现了 2 个不满意的解决方案:
解决方案 1:像这样使用@JsonProperty:
@Id
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
id 在 Elasticsearch 中写入并在 JSON 响应中无效:
{
"id" : null,
"name" : "abc",
"description" : null
}
所以它可以工作,但应用程序用户仍然看到这个属性存在。这很混乱。
解决方案 2:自定义对象映射器以忽略空值
Spring-boot 有一个内置选项:
spring.jackson.serialization-inclusion=NON_NULL
问题:它抑制了所有非空属性,而不仅仅是那些我想忽略的属性。假设前一个实体的description字段为空,则JSON响应为:
{
"name" : "abc"
}
这对 UI 来说是个问题。
那么有没有办法只在 JSON 响应中忽略此类字段?
【问题讨论】:
标签: java elasticsearch spring-boot jackson