在Spring Data rest json Response中动态过滤实体字段

时间:2015-07-24 10:50:34

标签: json rest spring-mvc jackson spring-data-rest

您好我要求动态忽略spring数据休息响应中的实体字段[我知道它们可以通过使用@JsonIgnore注释以静态方式完成]理想情况下基于Spring安全角色。角色部分仍然可以管理但是如何动态忽略json响应中的字段是一个挑战。 经过一些分析和文档后,我认为杰克逊是可行的方式,因为弹簧数据休息确实通过jackson模块和mixins http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.custom-jackson-deserialization提供jackson定制。

所以我认为在jackson api中它可以通过@jsonFilter完成,然后在ObjectMapper编写对象时提供相同内容[更多细节http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html]

但是我不确定如何将它与Spring数据休息联系起来(基本上是我将filterprovider注入spring数据休息对象映射器的部分)。让我知道是否有人尝试过这个或来自Spring数据团队的人有见解。

我会自己发布答案如果我能够达到同样的目的。

更新

所以我发现实现自定义过滤的方法是通过jackson BeanSerializerModifier。来自Twitter上@cowtowncoder的大力帮助。也可以使用jackson过滤有用的参考或圣杯http://www.cowtowncoder.com/blog/archives/2011/02/entry_443.html

1 个答案:

答案 0 :(得分:5)

所以是的,我终于能够解决这个问题。这里的技巧是使用自定义BeanSerializerModifier并通过自定义模块注册它[这是自定义钩子可用于自定义弹簧数据休息杰克逊序列化],类似于

 setSerializerModifier( new CustomSerializerModifier()).build()));

现在你可以通过覆盖方法changeProperties来自定义我们的BeanSerializerModifier来应用你的自定义过滤器,它基本上包括并根据你的逻辑排除BeanPropertyWriter。下面的例子

List<BeanPropertyWriter> included = Lists.newArrayList();
    for (BeanPropertyWriter property : beanProperties)
        if (!filter.contains(property.getName()))
            included.add(property);

通过这种方式,您可以为每个类或其他方式包含任何逻辑,并以自定义方式过滤响应属性.Hope It Helps

还在github上更新了我的代码,请查看https://github.com/gauravbrills/SpringPlayground