SpringMVC在返回JSON数据时出现406错误解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tianjindong0804/article/details/85002816

       在SpringMVC框架的使用中常常会使用@ResponseBody注解,修饰“处理器”(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回的对象转成JSON字符串响应给客户端,但这种操作有时会出现406错误。

引入问题

     我们通过浏览器访问一个处理器,该处理器返回一个JSON字符串,但是我们访问后报406错误。

处理器代码

        @RequestMapping("/cart/update/num/{itemId}/{itemNum}")
	@ResponseBody
	public 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}")
	@ResponseBody
	public 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。

猜你喜欢

转载自blog.csdn.net/tianjindong0804/article/details/85002816
今日推荐