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

时间:2010-02-13 23:33:37

标签: java json spring spring-mvc jackson

我将我的messageconverter配置为杰克逊的

class Foo{int x; int y}

并在控制器中

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

从那个我希望从服务器返回一个JSON字符串{x:'3',y:'4'}而没有任何其他配置。但是对我的ajax请求收到404错误响应

  

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

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

这是我的conf.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>

8 个答案:

答案 0 :(得分:22)

您需要以下内容:

  1. 设置注释驱动的编程模型:将<mvc:annotation-driven />放入spring.xml
  2. 在类路径中放置jaskson jar(Maven artifactId为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)
    }
    
  4. 这适合我。

    请注意,

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

答案 1 :(得分:3)

这对我有用:

@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()具有魔力。

答案 2 :(得分:3)

MessageConverter接口http://static.springsource.org/spring/docs/3.0.x/javadoc-api/定义了一个getSupportedMediaTypes()方法,在MappingJacksonMessageCoverter的情况下返回application / json

public MappingJacksonHttpMessageConverter() {
    super(new MediaType("application", "json", DEFAULT_CHARSET));
}

我假设缺少一个Accept:application / json请求标头。

答案 3 :(得分:2)

HTTP 404错误仅表示无法找到资源。这可能有两个原因:

  1. 请求网址错误(客户端错误或指定链接/按钮中的网址错误)。
  2. 资源不在您预期的位置(服务器端错误)。
  3. 要修复1,请确保您使用或提供正确的请求网址(区分大小写!)。要修复2,请检查服务器启动日志以查找任何启动错误并相应地修复它们。

    这一切都超出了迄今为止发布的代码和信息。

答案 4 :(得分:1)

我发现我也需要jackson-core-asl.jar,而不仅仅是jackson-mapper-asl.jar

答案 5 :(得分:0)

这只是一个猜测,但默认情况下,杰克逊只会自动检测公共字段(和公共访问者;但不管可见性如何,都是所有设置者)。如果需要,可以将此配置(版本为1.5)也自动检测私有字段(有关详细信息,请参阅here)。

答案 6 :(得分:0)

我猜404与你的HttpMessageConverter无关。我有同样的404问题,原因是我忘了只有匹配 <url-pattern> 的请求被发送到DispatcherServlet(我将请求映射从* .do更改为* .json)。也许这也是你的情况。

答案 7 :(得分:0)

除了这里的答案..

如果你在客户端使用jquery,这对我有用:

爪哇:

@RequestMapping(value = "/ajax/search/sync") 
public ModelAndView sync(@RequestBody Foo json) {

Jquery(你需要包含Douglas Crockford的json2.js以获得JSON.stringify函数):

$.ajax({
    type: "post",
    url: "sync", //your valid url
    contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
    data: JSON.stringify(jsonobject), //json object or array of json objects
    success: function(result) {
        //do nothing
    },
    error: function(){
        alert('failure');
    }
});