Spring MVC - 强制控制器生成MappingJacksonJsonView(s)

8
这里有一个使用JSP的基本Web应用程序,需要提供一些基于JSON的REST服务URL。
这些URL将全部位于“/services”下,并由“MyRestServicesController”生成。
我看到的设置基于JSON视图的示例都使用ContentNegotiatingViewResolver。但在我看来,这个解析器似乎过于复杂,因为它似乎是针对同一URL可能产生不同输出的情况。
我只想让我的一个RestServicesController始终生成MappingJacksonJsonView(s)。
是否有更简洁、更直接的方法来指导控制器实现这一点?

你是否特别需要 MappingJacksonJsonView,还是只是想要输出 JSON? - skaffman
JSON输出是最终目标,使用标准的Spring组件似乎是最佳实践。Johan说得很对。 - David Parks
3个回答

12

有没有更简洁、更直接的方法来指示控制器执行这个操作?

是的,有。你可以看一下我在Spring论坛上发布的这个示例。简而言之,我喜欢通过以下方式来实现。

应用程序上下文:

<!-- json view, capable of converting any POJO to json format -->
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

控制器

@RequestMapping("/service")
public ModelAndView getResultAsJson() {
    Object jsonObj = // the java object which we want to convert to json
    return new ModelAndView("jsonView", "result", jsonObj);
}

编辑 2013:在现代,@skaffman的方法是一个不错的替代方案。


哦,是的,那很有道理,而且非常简单。正是我所希望的,回应也超级快。万分感谢。我一定读了5遍有关BeanName解析器的内容,但从未想到要使用它,我想我的头脑还停留在模板领域。 - David Parks

9
如果您只需要输出JSON,则视图层本身是多余的。您可以使用@ResponseBody注释指示Spring直接序列化模型,使用Jackson。它比MappingJacksonJsonView方法需要更少的配置,代码更简洁。

1
+1 这对我有用。你知道我怎么改变内容类型吗? - stacker
2
@ResponseBody 有一个缺点,就是在控制器返回后,视图会立即呈现,这会关闭 HttpResponse,因此无法添加标头(例如通过拦截器的 postHandle 方法)。使用 ContentNegotiatedViewResolver 就不会有这个问题。 - devdanke

3

感谢提供的视频链接,正在观看中。 - stivlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接