Spring 3.0 使用 jackson 消息转换器进行 JSON 响应

2022-09-01 20:58:02

我将我的消息转换器配置为杰克逊的,然后

class Foo{int x; int y}

和控制器中

@ResponseBody
public Foo method(){
   return new Foo(3,4)
}

从中,我期望从服务器返回JSON字符串{x:'3',y:'4'},而无需任何其他配置。但是收到404错误响应我的ajax请求

如果使用 @ResponseBody 对方法进行批注,则返回类型将写入响应 HTTP 正文。返回值将使用 HttpMessageConverters 转换为声明的方法参数类型。

我错了吗?或者我应该使用序列化程序自己将响应对象转换为Json字符串,然后将该字符串作为响应返回。(我可以正确地做出字符串响应)还是应该进行其他一些配置?比如为 Foo 类添加注释

这是我的同伴.xml

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

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


答案 1

您需要具备以下条件:

  1. 设置注释驱动的编程模型:放入<mvc:annotation-driven />spring.xml
  2. 将 jaskson jar (Maven artifactId is ) 放在 classpath 中。org.codehaus.jackson:jackson-mapper-asl
  3. 使用方法如下:

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
    public @ResponseBody Foo method(@Valid Request request, BindingResult result){
    return new Foo(3,4)
    }
    

这对我有用。

请注意,

  1. @ResponseBody应用于返回类型,而不是方法定义。
  2. 您需要注释,以便Spring可以检测到它。@RequestMapping

答案 2

这对我有用:

@RequestMapping(value = "{p_LocationId}.json", method = RequestMethod.GET)
protected void getLocationAsJson(@PathVariable("p_LocationId") Integer p_LocationId,
     @RequestParam("cid") Integer p_CustomerId, HttpServletResponse response) {
        MappingJacksonHttpMessageConverter jsonConverter = 
                new MappingJacksonHttpMessageConverter();
        Location requestedLocation = new Location(p_LocationId);
        MediaType jsonMimeType = MediaType.APPLICATION_JSON;
        if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) {
        try {
            jsonConverter.write(requestedLocation, jsonMimeType,
                                   new ServletServerHttpResponse(response));
            } catch (IOException m_Ioe) {
                // TODO: announce this exception somehow
            } catch (HttpMessageNotWritableException p_Nwe) {
                // TODO: announce this exception somehow
            }
        }
}

请注意,该方法不会返回任何内容:魔术。MappingJacksonHttpMessageConverter#write()