Spring-MVC 406不可接受而不是JSON响应

我正在尝试使用Spring 3.0.6返回JSON响应,但我得到406响应“Not Acceptable”,其描述为:“此请求标识的资源只能生成具有不可接受的特征的响应”请求“接受”标题()。“

我知道之前已经提出了一个非常类似的问题 ,但是我无法让它适用于我的项目,尽管进行了许多测试但我不明白我做错了什么。

在我的Maven pom.xml中,我有以下内容:

 org.codehaus.jackson jackson-mapper-asl 1.8.5 compile   org.codehaus.jackson jackson-core-asl 1.8.5 compile  

在web.xml中,我引用webmvc-config.xml,日志确认已加载。

  mainServlet org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/spring/webmvc-config.xml  1  

在webmvc-config.xml中,我有以下内容:

       

我的控制器是:

 @Controller public class ClassifiedController { @RequestMapping(value = "/classified/{idClassified}", headers = "Accept=*/*", method = RequestMethod.GET) @ResponseBody public final Classified getClassified(@PathVariable final int idClassified) { ... 

我尝试使用或不使用headers参数,但结果相同。 如果我直接使用Firefox调用URL,请求标头包含以下内容(使用firebug进行检查):

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

如果我使用以下JQuery:

 $.ajax({ url: '/classified/38001', type: 'GET', dataType: 'json' }); 

发送以下标头:

 Accept: application/json, text/javascript, */*; q=0.01 

在这两种情况下,结果都是406错误。 我不知道还应该检查什么才能让它发挥作用。


更新 :我决定通过Spring进行调试,我发现Jackson被正确调用,并且在org.codehaus.jackson.map.ser.StdSerializerProvider中方法_findExplicitUntypedSerializer包含以下代码:

 try { return _createAndCacheUntypedSerializer(runtimeType, property); } catch (Exception e) { return null; } 

这是不幸的,因为隐藏了问题的根源。 使用调试器,我发现该exception包含一个非常描述性的错误消息:

 Conflicting getter definitions for property "reminded": ClassifiedImpl#isReminded(0 params) vs ClassifiedImpl#getReminded(0 params) 

现在,我看到错误消息是一个愚蠢的错误,很容易修复,但没有它,这不是那么明显。 事实上,修复问题,导致工作序列化。

就MappingJacksonJson处理而言,您需要确保Jackson ObjectMapper支持您的序列化对象类型 。

在DispatcherServlet-servlet.xml中添加以下内容。

         

我在Spring MVC和@RestController注释中偶然发现了同样的错误(406:内容不可接受)。

Spring处理程序:

 @RequestMapping(value = "/stuff-acknowledgment/{id}", produces ="application/json;charset=UTF-8", headers="Accept=*") public Message acknowledgeStuff(@PathVariable("id") String id, @ModelAttribute("ack") AckBean acquittement) { 

观察:

  • URI的格式为: http://www.host.com/stuff-acknowledgment/{id}http://www.host.com/stuff-acknowledgment/{id}
  • 但是$id有一个非常特殊的格式: xxxcomplicatedhashxxx.png (或者你能想到的任何扩展名)。

因此:

Spring MVC解释扩展并希望生成相同mime类型的结果(即使我将其定义为路径变量),这里也是"image/png" MIME类型,即使我告诉他生成JSON。 因此抛出了406exception。

固定:

删除URI中的".png"扩展名,或者删除PathVariable并将其放在正文中,或者在pathVariable后面添加一个后缀(未经测试但也应该可以正常工作),重点是避免文件扩展名结尾的URI。

PS:我知道它没有回答问题中的具体问题(使用更新中的解决方案),但我发现SO线程在搜索该问题并在此处发布我的修复记录,希望它可以帮助某人在未来。

我遇到了这个问题,因为我想要作为JSON返回的对象没有任何其属性的getter方法。 jackson可能需要这些。 添加它们之后就可以了。

虽然这个post有点旧…

你需要添加以下(maven依赖):

org.codehaus.jacksonjackson映射器,asl1.9.13