2016-04-21 69 views
0

我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。忽略Elasticsearch中的JsonIgnore

我使用JSON序列化的2型动物的地方代码:

  • 在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。因此,当序列化为Elasticsearch时,忽略@JsonIgnore的字段。

到现在为止,我发现2个不令人满意的解决方案:

解决方案1 ​​:使用@JsonProperty这样的:

@Id 
@JsonProperty(access = JsonProperty.Access.READ_ONLY) 
private Long id; 

id被写在Elasticsearch和JSON响应是无效:

{ 
    "id" : null, 
    "name" : "abc", 
    "description" : null 
} 

因此,它的工作原理,但应用程序用户仍然看到该属性存在。这很混乱。

解决方案2:Cutomize对象映射到忽略空值

春季启动有一个内置选项:

spring.jackson.serialization-inclusion=NON_NULL 

问题:抑制所有非空的属性,不仅是我想忽略的那些。假设前面的实体领域description是空的,JSON响应将是:

{ 
    "name" : "abc" 
} 

这是对UI问题。

那么有没有办法只在JSON响应中忽略这样的字段?

回答

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视图。