【问题标题】:Ignore JsonIgnore in Elasticsearch在 Elasticsearch 中忽略 JsonIgnore
【发布时间】: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


    【解决方案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 视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2015-07-15
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多