我正在开发一个使用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。因此,@JsonIgnore当序列化到Elasticsearch时,将忽略带有的字段。
@JsonIgnore
到目前为止,我发现了2个令人不满意的解决方案:
解决方案1 :@JsonProperty像这样使用:
@JsonProperty
@Id @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long id;
将id被写在Elasticsearch和JSON响应是无效:
id
{ "id" : null, "name" : "abc", "description" : null }
这样就可以了,但是应用程序用户仍然看到此属性存在。太乱了
解决方案2 :将对象映射器裁切以忽略空值
Spring-boot有一个内置选项:
spring.jackson.serialization-inclusion=NON_NULL
问题:它抑制所有非空属性,不仅抑制那些我想忽略的属性。假设description先前实体的字段为空,则JSON响应将为:
description
{ "name" : "abc" }
这对于UI来说是有问题的。
那么有没有办法仅在JSON响应中忽略此类字段?
您可以将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视图。
objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);
Private