Spring MappingJacksonJsonView,如何分辨使用它而不是JSP视图?
问题内容:
-
我试图
MappingJacksonJsonView
与Spring 3.0 -
一起使用,但没有成功。我不知道自己在做什么错,我认为问题是我不知道如何使用
MappingJacksonJsonView
来呈现请求。我试图对的视图名称和bean名称使用相同的名称MappingJacksonView
,但是没有用。我在这里构建了一个示例测试应用程序: https - //github.com/stivlo/restjson
在web.xml中,我已经定义了ContextLoaderListener
和的映射dispatcherServlet
。
<mvc:annotation-driven/>
和
<bean name="jsonView"
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
在org.obliquid.restjson.web.ToDoList.java中,我将逻辑视图名称设置为jsonView
。
但是,MappingJacksonJsonView
根据我的JSP映射,它不是使用而是查找JSP文件。
message /restjson/WEB-INF/jsp/jsonView.jsp
description The requested resource (/restjson/WEB-INF/jsp/jsonView.jsp)
is not available.
我应该更改什么才能MappingJacksonJsonView
用作渲染器?
更新1 :在以下测试中,我发现,如果将以下内容添加到servlet-
context.xml中,则JSON呈现有效,但其他视图(呈现为JSP(主页))不再起作用。
<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
更新2
:我删除了,BeanNameViewResolver
并更改了ToDoList.java以直接返回要转换为JSON的Collection,而不是带有@ResponseBody
注释的ModelAndView,如下所示:
@RequestMapping("/toDoList")
public @ResponseBody List<ToDoItem> test() {
List<ToDoItem> toDoList = new ArrayList<ToDoItem>();
toDoList.add(new ToDoItem(1, "First thing, first"));
toDoList.add(new ToDoItem(1, "After that, do the second task"));
return toDoList;
}
这样就可以了。即使映射更加“神奇”。我想知道,例如,如果存在用于XML的类似渲染器,Spring如何知道要选择哪个渲染器?
问题答案:
Spring将使用Accept
客户端发送的标头返回最合适的视图。在这里,您将找到我完整的Spring
MVC应用程序,该应用程序同时返回JSON和XML。
如您所见,我只需要:
<mvc:annotation-driven />
我还使用了相同的批注:@RequestMapping
将请求映射到方法,并@ResponseBody
告诉Spring我从控制器返回的是实际响应。但是,它可能需要一些调整/格式化,在这里Spring负责将对象编组为最合适的类型,例如JSON。