SpringMVC @ResponseBody注解 json转换 返回406
2017-10-02 09:14
615 查看
1、描述
SpringMVC通过@RequestMapping注解,自动将对象转换为接送返回。浏览器请求后却返回406错误码。@Controller public class IndexAction { @RequestMapping("/userList") public @ResponseBody List<TXUser> userList(String updated_at){ System.out.println(updated_at); TXUser user1=new TXUser(); user1.setAccount("a1"); user1.setCode("11"); user1.setCreated_at(new Date()); user1.setName("user1"); TXUser user2=new TXUser(); user2.setAccount("a2"); user2.setCode("22"); user2.setCreated_at(new Date()); user2.setName("user2"); List<TXUser> userslist=new ArrayList<TXUser>(); userslist.add(user1); userslist.add(user2); return userslist; } @RequestMapping("/index") public String index(){ return "index"; } }
2、原因
网上找过相关解决方法,但都是修改SpringMVC配置文件添加Converter。我对应修改后均无效。通过debug,发现返回406的原因是因为org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor中的writeWithMessageConverters方法出现异常。List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(servletRequest); List<MediaType> producibleMediaTypes = getProducibleMediaTypes(servletRequest, returnValueClass); Set<MediaType> compatibleMediaTypes = new LinkedHashSet<MediaType>(); for (MediaType requestedType : requestedMediaTypes) { for (MediaType producibleType : producibleMediaTypes) { if (requestedType.isCompatibleWith(producibleType)) { compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType)); } } }
以上代码中,各个变量的值最后分别为
变量 | 值 |
---|---|
requestedMediaTypes | [text/html] |
producibleMediaTypes | [application/json;charset=UTF-8,application/x-www-form-urlencoded;charset=UTF-8,application/json;charset=UTF-8,application/*+json;charset=UTF-8] |
compatibleMediaTypes | [] |
3、解决办法
找到对应原因,通过网络查找资料后,发现修改web.xml文件原:
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>
修改后:
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
修改xml后,浏览器再次请求后,正常返回json,不会返回406错误码了。
此时再次debug,三个变量的值分别为
变量 | 值 |
---|---|
requestedMediaTypes | [text/html,application/xhtml+xml, image/webp,application/xml;q=0.9,* /*;q=0.8] |
producibleMediaTypes | [application/json;charset=UTF-8,application/x-www-form-urlencoded;charset=UTF-8,application/json;charset=UTF-8, application/*+json;charset=UTF-8] |
compatibleMediaTypes | [application/json;charset=UTF-8;q=0.8,application/x-www-form-urlencoded;charset=UTF-8;q=0.8,application/*+json;charset=UTF-8;q=0.8] |
相关文章推荐
- 解决spring-mvc @responseBody注解返回json 乱码问题
- SpringMVC @ResponseBody返回json数据 浏览器406 error 解析
- SpringMVC @ResponseBody 返回json date 转换
- SpringMVC @ResponseBody 返回json date 转换
- 解决spring-mvc @responseBody注解返回json 乱码问题
- 解决spring-mvc @responseBody注解返回json 乱码问题
- 解决spring-mvc @responseBody注解返回json 乱码问题
- 解决spring-mvc @responseBody注解返回json 乱码问题
- springmvc @ResponseBody返回json 报406 not acceptable
- 解决spring-mvc @responseBody注解返回json 乱码问题
- spring mvc@Responsebody注解 对返回json格式数据的支持
- 解决spring-mvc @responseBody注解返回json 乱码问题
- spring 注解 @ResponseBody 返回JSON 设置不返回为 null 的值
- spring-mvc @responseBody注解返回中文乱码解决
- Spring MVC @ResponseBody注解返回响应流时中文乱码问题的解决
- spring mvc @responsebody返回json数据 ie浏览器弹出下载页面 解决方案
- 实现SpringMVC中使用@Responsebody注解返回任意POJO对象转换成JSON
- spring自带的json转换工具,支持@ResponseBody注解
- Spring MVC+hibernate 使用@ResponseBody返回json报500 (Internal Server Error)
- SpringMVC 利用@ResponseBody注解返回Json时,出现406 not acceptable 错误的解决方法。