elasticsearch,spring-boot,jackson,Java,elasticsearch,Spring Boot,Jackson" /> elasticsearch,spring-boot,jackson,Java,elasticsearch,Spring Boot,Jackson" />

Java 忽略Elasticsearch中的JsonIgnore

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

我正在开发一个使用SpringBoot、关系数据库和Elasticsearch的应用程序

我在代码中的两个不同位置使用JSON序列化:

  • 在restapi的响应中
  • 当代码与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。因此,当序列化为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
视图