0

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

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

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

谁能提出另一种实现这一目标的方法或告诉我为什么JsonIgnore注释不起作用?

4

2 回答 2

2

MappingJacksonJsonView将模型的所有内容序列化为 json - 您放置在模型对象中的所有对象,因此您是否使用 标记了服务方法之一并不重要@JsonIgnore,只要它最终出现在它所做的模型中因为对它的调用model.addAttribute("foo"..会被序列化。修复可能只是不添加模型属性,或者使用@ResponseBody它可以让您控制正在序列化的特定响应对象。

另一种选择是指定配置时将使用的确切键MappingJacksonJsonView

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" name="jsonView">
<property name="modelKeys">
   <set>
    <value>model1</value>
    <value>model2</value>
   </set>
</property>
</bean>
于 2012-11-28T00:12:42.387 回答
0

扩展 MappingJackson2JsonView 类并覆盖 filterMap(Map model) 方法。在 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);
    }
}
于 2019-02-14T19:02:16.540 回答