HTTP状态406. Spring MVC 4.0,jQuery,JSON

我想从我的控制器发送JSON。 我有以下配置。

spring-servlet.xml:

           

.js:

 function testAjax() { var data = {userName: "MyUsername", password:"Password"}; $.ajax({ url: 'ajax/test.htm', dataType : 'json', type : 'POST', contentType: "application/json", data: JSON.stringify(data), success: function(response){ alert('Load was performed.'); } }); } 

UserTest.java:

 public class UserTest { private String userName; private String password; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 

TestAjaxController.java:

 @Controller @RequestMapping("/ajax") public class TestAjaxController { @RequestMapping(method = RequestMethod.POST, value = "/test.htm") public @ResponseBody UserTest testAjaxRequest(@RequestBody UserTest user) { return user; } } 

pom.xml:

   org.codehaus.jackson jackson-mapper-asl 1.9.13   org.codehaus.jackson jackson-core-asl 1.9.13  

当我做这个请求时,我进入我的Controller JSON表示为UserTest对象。 但回来时:

HTTP状态406-由该请求标识的资源仅能够根据请求“接受”报头生成具有不可接受的特性的响应。

我做错了什么? 我知道,有很多关于此类案件的问题,但我无法解决它2天……

更新我找到了解决方案!! 它只需要返回一个Object。 不是用户对象或其他东西。 但是return Object;

  public @ResponseBody Object testAjaxRequest(@RequestBody UserTest user) { List list = new ArrayList(); list.add(user); list.add(user); list.add(user); return list; 

这里的主要问题是路径"/test.htm"将在检查Accept标头的值之前首先使用内容协商。 使用*.htm这样的扩展名,Spring将使用org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy并解析要返回的可接受媒体类型是text/html ,它与MappingJacksonHttpMessageConverter生成的不匹配,即。 application/json因此返回406。

简单的解决方案是将路径更改为/test ,其中基于路径的内容协商不会解析响应的任何内容类型。 相反,基于标头的不同ContentNegotiationStrategy将解析Accept标头的值。

复杂的解决方案是更改使用处理@ResponseBodyRequestResponseBodyMethodProcessor注册的ContentNegotiationStrategy对象的顺序。

我有同样的问题,最后它是org.codehaus.jackson 1.9.x的版本,当我从1.9.x jackson切换到我的pom.xml中的2.x(fasterxml)

  com.fasterxml.jackson.core jackson-core 2.2.3   com.fasterxml.jackson.core jackson-databind 2.2.3   com.fasterxml.jackson.core jackson-annotations 2.2.3  

也是必要的:

在遗留项目中升级Spring时遇到了这个问题。 由于后缀,AJAX端点(试图返回JSON)的.html后缀确实被强制用于尝试生成HTML,并且由于处理程序返回了一个对象,因此请求以406错误结束,因为Spring无法弄清楚如何用普通的Java对象制作HTML。

不是更改端点后缀,也不是对自定义ContentNegotiationStrategy进行完整配置, ContentNegotiationStrategy进行此更改就足够了:

  

变成:

     

将这些行添加到上下文配置为我解决了同样的问题:

       

我使用的是Spring 4.1.xJackson 2.4.2

确保在注释中使用produce =“application / json”。