SpringMVC的@RequestMapping注解只能将produces设置为text/html

遇到了一个奇葩的问题。我想通过Controller返回JSON格式数据,代码如下:

 @RequestMapping(value="ajax",produces="application/json")
    public ResponseEntity<Message> service(HttpServletRequest request){
       //......
    }

这样在通过jQuery请求时,根本不进入方法,直接返回406错误。但通过浏览器调试工具可以看到Accept请求头确实是application/json。

后来改成了:

 @RequestMapping(value="ajax",produces="text/html")
    public ResponseEntity<Message> service(HttpServletRequest request){
       System.out.println(request.getHeader("Accept"));
    }

就能进入方法执行了!但是在方法内通过request.getHeader("Accept")输出的确实是application/json啊!

也就是说,浏览器发送的Accept请求头确实是application/json,但在与@RequestMapping匹配时SpringMVC认为Accept请求头是text/html,而且认为返回的响应内容也是text/html类型的!这难道是bug吗?

BTW,我使用的是Spring3.2.17,在网上查资料看到很多人要在配置文件中重新定义MappingJacksonHttpMessageConverter,在supportedMediaTypes中添加text/html,是不是就是这个原因?

返回json时 在方法上加上注解 @Responsebody 要不一直会默认返回一个页面给前台

加上注解 @Responsebody是返回一个字符串、要json可以自己去将要返回的数据转成json,也可以用MappingJacksonHttpMessageConverter

楼上@Responsebody都是正确答案,大多数情况我们只需要返回json格式的字符串而不需要返回json对象,所以加上@Responsebody就行了。