Spring MappingJacksonJsonView,如何告诉使用它而不是JSP视图?

时间:2011-07-22 19:19:12

标签: java json spring spring-mvc

我正在尝试在Spring 3.0中使用MappingJacksonJsonView,但没有成功。我不知道我做错了什么,我认为问题在于我不知道如何判断使用MappingJacksonJsonView来呈现请求。我试图为MappingJacksonView的视图名称和bean名称使用相同的名称,但是没有用。我在这里建立了一个示例测试应用程序:https://github.com/stivlo/restjson

web.xml我已定义ContextLoaderListener以及dispatcherServlet的映射。

servlet-context.xml我添加了

<mvc:annotation-driven/>

<bean name="jsonView"
    class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>

org.obliquid.restjson.web.ToDoList.java中,我将逻辑视图名称设置为jsonView

但是,根据我的JSP映射,它不是使用MappingJacksonJsonView,而是查找JSP文件。

message /restjson/WEB-INF/jsp/jsonView.jsp
description The requested resource (/restjson/WEB-INF/jsp/jsonView.jsp) 
    is not available.

使用MappingJacksonJsonView作为渲染器,我应该更改什么?

UPDATE 1 :在以下测试中,我发现如果我将以下内容添加到我的servlet-context.xml中,则JSON渲染可以正常工作,但我的另一个视图,呈现为JSP(home)是不再工作了。

<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />

更新2 :我删除了BeanNameViewResolver并更改了我的ToDoList.java,直接返回要使用@ResponseBody注释以JSON而不是ModelAndView转换的Collection ,如下:

@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如何知道要选择哪个渲染器?

4 个答案:

答案 0 :(得分:4)

Spring将使用客户端发送的Accept标头返回最合适的视图。 Here您将找到我的完整Spring MVC应用程序,它返回JSON和XML。

如您所见,我只需要:

<mvc:annotation-driven />

我还使用相同的注释:@RequestMapping将请求映射到方法,@ResponseBody告诉Spring我从控制器返回的是实际响应。然而,它可能需要一些调整/格式化,这里Spring负责将您的对象编组为最合适的类型,如JSON。

答案 1 :(得分:2)

你应该这样做:

在xml文件中设置以下内容:set

<mvc:annotation-driven />

之后你需要设置Jackson序列化器:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="jacksonMessageConverter"/>
  </list>
</property>
</bean>

之后你可以在你的Controller中使用它:

@RequestMapping(value="/getObjects",method = RequestMethod.POST)
     @ResponseBody
     public  List<MyObject> getCategories(){
     List<MyObject> objects = daoService.gettAllObjects();
     return objects;
    }

答案 2 :(得分:0)

在我的案例中添加以下内容

<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="0" />
    </bean>

所以基本上我们应该首先尝试将任何视图解析为bean

答案 3 :(得分:0)

您需要查看 ContentNegotiatingViewResolver ,并将 defaultviews 属性设置为 MappingJacksonJsonView ,而@ResponseBody使用HttpMessageConverter代替ViewSolver,请参阅他们之间的差异 http://ufasoli.blogspot.com/2013/08/viewresolver-vs-messageconverter-spring.html