Jackson 视图
除了通过 @ResponseBody 自动转换对象外,Spring MVC 还提供了专门的视图类,用于显式地将模型数据渲染为 JSON 或 XML。这在需要对返回结果进行动态包装,或者在同一个控制器中根据逻辑选择渲染方式时非常有用。
Jackson JSON 视图
MappingJackson2JsonView 使用 Jackson 库将模型中的数据序列化为 JSON 格式。
基本用法
默认情况下,它会将模型中所有的属性都序列化到 JSON 对象中。
java
@GetMapping("/api/user/{id}")
public ModelAndView getUserAsJson(@PathVariable Long id) {
User user = userService.findById(id);
ModelAndView mav = new ModelAndView(new MappingJackson2JsonView());
mav.addObject("user", user);
return mav;
}限制序列化范围
如果你只想序列化模型中的特定属性,可以设置 modelKeys。
java
MappingJackson2JsonView view = new MappingJackson2JsonView();
// 仅允许模型中的 "user" 键被序列化
view.setModelKeys(Collections.singleton("user"));
return new ModelAndView(view, "user", user);这样,即使模型中有其他为了页面渲染准备的属性(如菜单、用户信息等),也不会出现在 JSON 响应中。
Jackson XML 视图 (可选)
虽然通常使用 MappingJackson2JsonView,但 Jackson 也支持 XML。如果你在类路径中包含了 jackson-dataformat-xml,那么 MappingJackson2XmlView 也可以用来渲染 XML。
补充教学
1. 视图 vs @ResponseBody
- @ResponseBody: 这是目前的主流做法。Spring 自动根据
Accept头选择转换器。配置更简单,代码更简洁。 - 视图类 (MappingJackson2JsonView):
- 优点:可以精细控制哪些模型 Key 参与序列化;支持在旧的 JSP/HTML 控制器中通过
ModelAndView动态返回 JSON 响应。 - 场景:遗留系统迁移,或某些必须使用视图技术进行统一分发的架构。
- 优点:可以精细控制哪些模型 Key 参与序列化;支持在旧的 JSP/HTML 控制器中通过
2. 内容协商 (Content Negotiation)
你可以将 Jackson 视图配置为 ContentNegotiatingViewResolver 的默认视图。这样,当客户端通过 URL 扩展名(如 .json)请求时,Spring 会自动选择 Jackson 视图来渲染模型。
3. JSONP 支持 (已过时)
Jackson 视图曾广泛用于支持 JSONP 跨域。但在现代 Web 开发中,由于 CORS 的普及,JSONP 已不再推荐使用,出于安全考虑,Spring 4.3+ 以后默认不再提供过于便捷的 JSONP 支持,建议全面转向 CORS。