Java 忽略Elasticsearch中的JsonIgnore
我正在开发一个使用SpringBoot、关系数据库和Elasticsearch的应用程序 我在代码中的两个不同位置使用JSON序列化:Java 忽略Elasticsearch中的JsonIgnore,java,
elasticsearch,spring-boot,jackson,Java,
elasticsearch,Spring Boot,Jackson,我正在开发一个使用SpringBoot、关系数据库和Elasticsearch的应用程序 我在代码中的两个不同位置使用JSON序列化: 在restapi的响应中 当代码与Elasticsearch交互时 我在Elasticsearch中需要一些属性,但我想对应用程序用户隐藏这些属性(例如,来自关系数据库的内部ID) 以下是实体的一个示例: @Document public class MyElasticsearchEntity { @Id private Long id; //I
- 在restapi的响应中
- 当代码与Elasticsearch交互时
@Document
public class MyElasticsearchEntity {
@Id
private Long id; //I want to hide this to the user.
private String name;
private String description;
}
问题:当对象在Elasticsearch中持久化时,它会被序列化为JSON。因此,当序列化为Elasticsearch时,将忽略带有@JsonIgnore
的字段
到目前为止,我发现了两个不令人满意的解决方案:
解决方案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响应中忽略此类字段呢?您可以将其用于您的目的。您可以定义一个视图,用于为应用程序用户序列化pojo:
将视图创建为类、一个公共视图和一个私有视图:
class Views {
static class Public { }
static class Private extends Public { }
}
然后将Pojo中的视图用作注释:
@Id
@JsonView(Views.Private.class) String name;
private Long id;
@JsonView(Views.Public.class) String name;
private String publicField;
然后使用以下视图为应用程序用户序列化pojo:
objectMapper.writeValueUsingView(out, beanInstance, Views.Public.class);
这是关于视图如何适合您的问题的许多其他示例之一。例如,您也可以使用objectMapper.configure(SerializationConfig.Feature.DEFAULT\u VIEW\u INCLUSION,false)
排除没有视图注释的字段,并删除Private
视图