gpt4 book ai didi

java - 在 Elasticsearch 中忽略 JsonIgnore

转载 作者:行者123 更新时间:2023-12-01 14:09:22 25 4
gpt4 key购买 nike

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

最佳答案

你可以使用 Jackson JsonView为了你的目的。您可以定义一个 View ,用于为应用程序用户序列化 pojo:

将 View 创建为类,一公一私:

class Views {
static class Public { }
static class Private extends Public { }
}

然后使用 Pojo 中的 View 作为注释:

@Id
@JsonView(Views.Private.class) String name;
private Long id;
@JsonView(Views.Public.class) String name;
private String publicField;

然后使用 View 为应用程序用户序列化您的 pojo:

objectMapper.writeValueUsingView(out, beanInstance, Views.Public.class);

这是关于 View 如何解决您的问题的许多其他示例之一。例如。您也可以使用 objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false); 来排除没有 View 注释的字段并删除 Private View 。

关于java - 在 Elasticsearch 中忽略 JsonIgnore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36765996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com