一尘不染

忽略Json忽略Elasticsearch

elasticsearch

我正在开发一个使用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响应中忽略此类字段?


阅读 246

收藏
2020-06-22

共1个答案

一尘不染

您可以将Jackson
JsonView
用于您的目的。您可以定义一个视图,该视图将用于为应用程序用户序列化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_VIEW_INCLUSION, false);来排除没有视图注释的字段并删除Private视图。

2020-06-22