我有一个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
注释不起作用?
答案 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);
}
}