使用带注释的控制器帮助spring-json

时间:2010-01-10 21:12:49

标签: ajax json spring-mvc

我已经the the互联网上的一个例子,它将同时使用spring-json和带注释的控制器,我是新手,所以我没有运气在spring-json的样本上调整配置(它使用SimpleController et。人)中

目前我有一个带有2个映射的控制器,一个列表导致html(和工作),另一个应该为某些ajax调用渲染json但是当我访问url时它返回404并要求/ myapp / jsp / jsonView .JSP。 show方法上的代码确实执行,它甚至验证了id param的存在,所以看起来问题是它不知道如何渲染,据我所知这是viewResolver bean的作用。

提前感谢您的任何帮助:)

这就是我所拥有的:

@Controller
public class ItemController {

 //This one works
 @RequestMapping(value = "/items", method = RequestMethod.GET)
 public ModelMap list() {
     ModelMap map = new ModelMap();
     map.addAttribute("item", "value");
     return map;
 }
 //This one returns 404, asks for jsonView.jsp
 @RequestMapping(value = "/items.json", method = RequestMethod.GET)
 public ModelAndView show(@RequestParam(value = "id", required = true) String id) {
    Map model = new HashMap();
    model.put("firstname", "Peter");
    model.put("secondname", "Schmitt");
    return new ModelAndView("jsonView", model);
  }
}

on myapp-servlet.xml:

    <bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"/>

在views.xml上:

<beans>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
    <property name="encoding">
        <value>UTF-8</value>
    </property>
    <property name="contentType">
        <value>application/json</value>
    </property>
    <property name="jsonWriter">
        <ref bean="sojoJsonWriter"/>
    </property>
    <property name="jsonErrors">
        <list>
            <ref bean="statusError"/>
            <ref bean="modelflagError"/>
        </list>
    </property>
</bean>

<bean name="sojoJsonWriter" class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter">
    <property name="convertAllMapValues">
        <value>true</value>
    </property>
</bean>

<bean name="statusError" class="org.springframework.web.servlet.view.json.error.HttpStatusError">
    <property name="errorCode">
        <value>311</value>
    </property>
</bean>
<bean name="modelflagError" class="org.springframework.web.servlet.view.json.error.ModelFlagError">
    <property name="name">
        <value>failure</value>
    </property>
    <property name="value">
        <value>true</value>
    </property>
</bean>

的web.xml:

<servlet>
 <servlet-name>myapp</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>myapp</servlet-name>
 <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

2 个答案:

答案 0 :(得分:2)

还有另一种选择:你能升级到春季3(它现在有发布状态)吗?有一个很棒的ContentNegotiationResolver,在内容协商和视图解析方面有很大的帮助。


<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 <property name="mediaTypes">
   <map>
   <entry key="xml" value="application/xml"/>
   <entry key="json" value="application/json"/>
...

如果现在将.json附加到您的URL路径或使用相应的“Accept”HTTP标头,则相应地序列化传递的对象(请参阅model.put(...))。对于json spring 3默认使用jackson

答案 1 :(得分:1)

问题在于servlet.xml上的视图解析器,添加了一个p:order属性,因此它会在InternalResourceViewResolver之前加载

    <bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver" p:order="1"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/"p:suffix=".jsp" p:order="10"/>