SpringMVC @ResponseBody返回json数据 浏览器406 error 解析

来源:互联网 发布:nginx 菜鸟教程 编辑:程序博客网 时间:2024/05/19 02:29

引起原因:

1.web.xml配置的SpringMVC <url-pattern>*.html</url-pattern> 

2.jar包的引用问题

SpringMVC4中:引入faster json包:以下给出maven依赖:引入json三大包之后:mvc配置文件中不需要配置messagehandleradapt 添加json转换器;SpringMVC会自动加载json转换器,当存在json包时;

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.5.0</version></dependency>

情况一:

web.xml配置如下:

1.<url-pattern>*.html</url-pattern>拦截html后缀的请求

<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><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring-mvc</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>


此时你的请求为html的后缀,返回浏览器的request的header为
Content-Type:
text/html;charset=utf-8
实际上数据此时是json格式,于是浏览器就会报出406错误:(
HTTP 406错误是HTTP协议状态码的一种,表示无法使用请求的内容特性来响应请求的网页。一般是指客户端浏览器不接受所请求页面的 MIME 类型),浏览器使用html解析不了json数据,于是报错,也就是说此处如果是
Content-Type:
application/json;charset=UTF-8的类型,浏览器就不会报错了,如下截图:

此时浏览器不报错了!!

为此我们需要进行一个配置,我们要引入内容协商管理器,并将其加入<mvc:annotation-driven/>

代码:

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">   <property name="favorPathExtension" value="false" />      <property name="favorParameter" value="false" />       <property name="ignoreAcceptHeader" value="false" />       <property name="mediaTypes" >         <value>          atom=application/atom+xml          html=text/html          json=application/json          *=*/*        </value>       </property>   </bean>  
在管理器中mediaTypes变量配置了对应类型value的Content-Type,紧接着配置<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>,加入mvc的引用中;此时浏览器访问正常;

情况二:

<url-pattern></url-pattern>配置为拦截所有请求,请求无后缀情况下,引入json包,即可使用@ResponseBody 返回json数据,无需配置内容协商管理器;



0 0
原创粉丝点击