本文主要是介绍SpringMVC在返回JSON数据时出现406错误解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在SpringMVC框架的使用中常常会使用@ResponseBody注解,修饰“处理器”(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回的对象转成JSON字符串响应给客户端,但这种操作有时会出现406错误。
引入问题
我们通过浏览器访问一个处理器,该处理器返回一个JSON字符串,但是我们访问后报406错误。
处理器代码
@RequestMapping("/cart/update/num/{itemId}/{itemNum}")@ResponseBodypublic User updateItemNum(@PathVariable("itemId") Long itemId, @PathVariable("itemNum") Integer itemNum,HttpServletRequest request, HttpServletResponse response) {return new User("张三",10);}
出现406问题的可能原因:
原因一:
该项目并没有导入jackson的相关jar包
Maven工程的依赖:
<!-- Jackson Json处理工具包 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
原因二:
请求后缀为.html,浏览器默认将相应体的内容当做html资源,但实际上相应的并不是Html资源,而是一个JSON。此时就会报406错误。
解决方案一:
第一步: 为前端控制器的拦截方式添加一种新的形式。
第二步:在需要返回JSON数据的请求时使用.action结尾的URL进行访问
解决方案二:
如果由于某种原因不能更改前端控制器的拦截方式,那么我们可以在处理器中将需要返回的对象,手动通过第三方JSON转换工具转换成字符串(这里使用fastjson),然后直接返回字符串。此时我们通过.html结尾的URL访问处理器就不会报406错误了。
处理器代码:
@RequestMapping("/cart/update/num/{itemId}/{itemNum}")@ResponseBodypublic String updateItemNum(@PathVariable("itemId") Long itemId, @PathVariable("itemNum") Integer itemNum,HttpServletRequest request, HttpServletResponse response) {return JSON.toJSONString(new User("张三",10));}
请求的结果:
此种方法之所以可以解决问题,是因为我们直接返回字符串,Http相应的ContentType就变成了html/text格式了,而在我们返回一个对象时,SpringMVC框架将对象转换成JSON对象时,Http相应的ContentType类型为application/json。
这篇关于SpringMVC在返回JSON数据时出现406错误解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!