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

Gau*_*wat 4 rest json spring-mvc jackson spring-data-rest

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

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

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

将自己发布答案如果我能够实现相同的目标.

UPDATE

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

Gau*_*wat 5

所以,最后我能够解决这个问题.这里的技巧是使用自定义BeanSerializerModifier并通过自定义模块注册它[这是自定义挂钩可用于自定义spring数据rest jackson序列化],类似于

 setSerializerModifier( new CustomSerializerModifier()).build()));
Run Code Online (Sandbox Code Playgroud)

现在你可以通过覆盖方法changeProperties来自定义我们的BeanSerializerModifier来应用你的自定义过滤器,它基本上包含和排除基于你的逻辑的BeanPropertyWriter.下面的示例

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

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

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