Skip to content

Jackson 视图

除了通过 @ResponseBody 自动转换对象外,Spring MVC 还提供了专门的视图类,用于显式地将模型数据渲染为 JSONXML。这在需要对返回结果进行动态包装,或者在同一个控制器中根据逻辑选择渲染方式时非常有用。

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 响应。
    • 场景:遗留系统迁移,或某些必须使用视图技术进行统一分发的架构。

2. 内容协商 (Content Negotiation)

你可以将 Jackson 视图配置为 ContentNegotiatingViewResolver 的默认视图。这样,当客户端通过 URL 扩展名(如 .json)请求时,Spring 会自动选择 Jackson 视图来渲染模型。

3. JSONP 支持 (已过时)

Jackson 视图曾广泛用于支持 JSONP 跨域。但在现代 Web 开发中,由于 CORS 的普及,JSONP 已不再推荐使用,出于安全考虑,Spring 4.3+ 以后默认不再提供过于便捷的 JSONP 支持,建议全面转向 CORS。

Based on Spring Framework.