大家好,又见面了,我是你们的朋友全栈君。
最近在做一个项目,发现自己从ajax发送请求后返回的json数据接收不到,后台没有报错,经测试ajax的seccess内代码没有走,打开浏览器控制台一看,报错post:406 not acceptable,接收后台传输过来响应的type为text/html。
上网查找类似问题,总结如下:
1、@responsebody标签没有加。那么返回的内容会经过视图解析器,加上标签后返回的数据会直接写入到输入流中,也就是直接写到http响应正文中。
2、没有导入json的jar包。没有json包自然不能转换成json数据,也自然接收不到。json包一般有两种,jackson和阿里的fastjson,都可以。PS:jackson有两个版本曾报过安全漏洞
3、springmvc配置文件中没有加<mvc:annotation-driven/>。
4、spring的版本与json版本不兼容。例如spring 4.X以上就需要匹配fastjson1.2.6以上的版本。
检查过后,这些我都没问题,那怎么还是406呢?问题出在<mvc:annotation-driven/>。
<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean。
RequestMappingHandlerMapping是处理请求映射的,处理@RequestMapping跟请求地址之间的关系。
RequestMappingHandlerAdapter是请求处理的适配器,也就是请求之后处理具体逻辑的执行,关系到哪个类的哪个方法以及转换器等工作。
我们使用@responsebody将数据直接写到响应正文中,如果是json或者xml数据是需要转换器对其进行转换的,<mvc:annotation-driven >下有子标签<mvc:messageConverters>,在标签下可以设定字符集和json处理类,例如:
代码语言:javascript复制<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这个StringHttpMessageConverter是spring自带的转换器,当然也可以在<mvc:annotation-driven >下定义别的转换器以及自定义转换器,并且可以同时定义多个转换器,当同时有多个转换器存在并且可用时,默认使用排序靠前的转换器,也就是按照从上到下的顺序。当然,标签下什么都不定义,那就会自动加载spring自带的转换器,如果想同时加载spring自带的转换器以及外部转换器,则可以在<mvc:messageConverters >标签内添加register-defaults=”true”属性,那么此时加载顺序为在xml中定义的转换器加上spring自带转换器,也就是说spring自带转换器的优先级会排在你定义的转换器之后。
我的问题便出在了这里,我用的fastjson,在引入了fastjson的转换器后就解决问题了,如下
代码语言:javascript复制<bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
网上关于406的问题不少,但没有看到和我这个问题一样的,故在此记录一笔,希望同碰到此问题的朋友有所借鉴。
同时,附上<mvc:annotation-driven >源码解析,一位博主写的,非常棒,传送门:
https://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-convert.html
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127436.html原文链接:https://javaforall.cn