我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。
我在代码中的2个不同位置使用JSON序列化:
我在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 :Cutomize对象映射器以忽略空值
Spring-boot有一个内置选项:
spring.jackson.serialization-inclusion=NON_NULL
问题:它会抑制所有非null属性,而不仅仅是那些我想忽略的属性。假设前一个实体的字段description
为空,JSON响应将为:
{
"name" : "abc"
}
这对UI来说是个问题。
那么有没有办法只在JSON响应中忽略这样的字段?
答案 0 :(得分:3)
您可以将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
视图。