24

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

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>

4

8 回答 8

22

您需要以下内容:

  1. 设置注解驱动编程模型:<mvc:annotation-driven />放入spring.xml
  2. 将 jaskson jar (Maven artifactId is 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. 您需要@RequestMapping注释,以便 Spring 检测到它。
于 2010-09-21T15:57:37.317 回答
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()具有魔力。

于 2010-05-06T21:00:51.023 回答
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 请求标头。

于 2011-02-23T19:44:18.613 回答
2

HTTP 404 错误仅意味着找不到资源。这可能有两个原因:

  1. 请求 URL 错误(客户端错误或给定链接/按钮中的 URL 错误)。
  2. 资源不在您期望的位置(服务器端错误)。

要修复 1,请确保您使用或提供正确的请求 URL(区分大小写!)。要修复 2,请检查服务器启动日志中是否存在任何启动错误并相应地修复它们。

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

于 2010-02-14T00:52:51.583 回答
1

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

于 2010-12-08T03:55:24.940 回答
0

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

于 2010-04-05T09:19:46.277 回答
0

这只是一个猜测,但默认情况下,Jackson 只自动检测公共字段(和公共 getter;但所有 setter,无论可见性如何)。如果需要,可以将其配置为(使用1.5版)以自动检测私有字段(有关详细信息,请参见此处)。

于 2010-03-22T16:52:09.550 回答
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');
    }
});
于 2012-08-12T13:54:26.493 回答