如何在JSON输出中排除某些modelAttributes(使用ContentNegotiatingViewResolver)

时间:2012-11-27 23:50:57

标签: json spring-mvc jackson

我有一个Spring MVC 3.1.0项目,我已经配置了一个ContentNegotiatingViewResolver bean来为给定端点(使用org.springframework.web.servlet.view.json.MappingJacksonJsonView)自动生成JSON输出。

我有一些控制器方法可以将数据添加到JSP页面(通过model.addAttribute("foo", fooService.getFoo());),我不希望它出现在JSON输出中。

我尝试在我的服务方法@JsonIgnore中添加getFoo()注释(返回Map<String, String>),但它不起作用。当我点击那个控制器时,我仍然看到foo对象在我的JSON输出中被编组。

有人可以提出另一种方法来实现这一点,或者告诉我为什么JsonIgnore注释不起作用?

2 个答案:

答案 0 :(得分:1)

MappingJacksonJsonView将模型的所有内容序列化为json - 您放置在模型对象中的所有对象,因此如果您使用{{1}标记了一个服务方法并不重要只要它因为调用@JsonIgnore而在模型中结束它就会被序列化。修复可能只是不添加模型属性,或使用model.addAttribute("foo"..,这将使您可以控制正在序列化的特定响应对象。

另一个选项是指定配置@ResponseBody时将使用的确切键:

MappingJacksonJsonView

答案 1 :(得分:0)

扩展MappingJackson2JsonView类并重写filterMap(Map模型)方法。 在filterMap方法中,过滤掉需要排除的具有modelAttributes名称的键。

public class MappingJackson2JsonViewExt extends MappingJackson2JsonView {
    private static final Set<String> EXCLUDED_KEYS = new HashSet<>();

    public static void excludeModelKey(final String key) {
        EXCLUDED_KEYS.add(key);
    }

    @Override
    protected Object filterModel(final Map<String, Object> model) {
        final Map<String, Object> filteredModel = model.entrySet().stream()
                .filter(e -> {
                    final String key = e.getKey();
                    return !EXCLUDED_KEYS.contains(key);
                })
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        return super.filterModel(filteredModel);
    }
}