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

遇到了一个奇葩的问题。我想通过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,是不是就是这个原因?

3个回答

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

ziwozizhan
ziwozizhan 回复baij1230: 谢谢啦 只是看到的稍微早一点 :)
3 年多之前 回复
baij1230
baij1230 正解。你好快啊
3 年多之前 回复

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐