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

我将我的messageconverter配置为jackson的

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

  

        

您需要以下内容:

  1. 设置注释驱动的编程模型:在spring.xmlspring.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) } 

这对我有用。

请注意,那

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

这对我有用:

 @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()完成了魔术。

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请求标头。

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

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

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

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

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

这只是一个猜测,但默认情况下,jackson只会自动检测公共字段(和公共getter;但不管可见性如何都是自动检测器)。 如果需要,可以将此配置(使用版本1.5 )自动检测专用字段(有关详细信息,请参见此处 )。

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

除了这里的答案..

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

Java的:

 @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'); } });