post请求406,not acceptable问题[通俗易懂]

最近在做一个项目,发现自己从ajax发送请求后返回的json数据接收不到,后台没有报错,经测试ajax的seccess内代码没有走,打开浏览器控制台一看,报错post:406not acceptable,接收后台传输过来响应的type为text/html。上网查找类似问题,总结如下:1、@responsebody标签没有加。那么返回的内容会经过视图解析器,加上标签后返回的数据会直接写入到…

大家好,又见面了,我是你们的朋友全栈君。

最近在做一个项目,发现自己从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 /> 会自动注册DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter 两个bean。

RequestMappingHandlerMapping是处理请求映射的,处理@RequestMapping跟请求地址之间的关系。

RequestMappingHandlerAdapter是请求处理的适配器,也就是请求之后处理具体逻辑的执行,关系到哪个类的哪个方法以及转换器等工作。

我们使用@responsebody将数据直接写到响应正文中,如果是json或者xml数据是需要转换器对其进行转换的,<mvc:annotation-driven >下有子标签<mvc:messageConverters>,在标签下可以设定字符集和json处理类,例如:

<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的转换器后就解决问题了,如下


<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.net/127436.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • volley7–NetworkDispatcher从网络中获取数据[通俗易懂]

    volley7–NetworkDispatcher从网络中获取数据

    2022年3月7日
    37
  • 在idea中创建web项目_idea部署web项目

    在idea中创建web项目_idea部署web项目前言:很高兴能够用自己所学知识为你提供答疑!!!今天我就来操作下如何使用idea这款软件创建web项目。步骤:1.创建项目首先新建一个项目然后选择最后一个,创建一个空白的Java项目,点击Next。这个时候给项目命名,我在这里命名为java_web,下面那个可以更改项目存放的路径,我这里放到自定的路径,点击Finish。刚进来的时候,idea会提醒你是否新建一个模块,先点击×,一会我们再创建模块。2.配置jdk这个时候,我们先来配置jdk的路径,以及tomcat的路径,方便之后

    2022年4月19日
    68
  • 优先队列「建议收藏」

    优先队列「建议收藏」优先队列比如现实生活中的排队,就符合这种先进先出的队列形式,但是像急诊医院排队,就不可能按照先到先治疗的规则,所以需要使用优先队列。实现优先队列其实都是基于下面这些实现的:可以看出来实现优先队列最

    2022年7月3日
    24
  • Java异常处理习题

    Java异常处理习题一、选择题1、java中用来抛出异常的关键字是()A.try     B.catch   C.throw         D.finally 2、关于异常,下列说法正确的是()A.异常是一种对象       B.一旦程序运行,异常将被创建C.为了保证程序运行速度,要尽量避免异常控制     D.以上说法都不对 3、()类是所有异常类的父类。A.Th

    2022年5月12日
    76
  • zabbix监控面试题[通俗易懂]

    zabbix监控面试题[通俗易懂]监控基础概论zabbix并非监控,而是实现监控的工具Zabbix-server是一个c/s和b/s结构安装zabbbix的服务器安装时和php7.1有冲突:若此机器上已经安装php7.1就安装不上zabbix监控知识体系为什么要使用监控1.对系统不间断实时监控2.实时反馈系统当前状态3.保证服务可靠性安全性4.保证业务持续稳定运行如果去到…

    2022年6月12日
    58
  • pycharm最新激活码2021 3月最新注册码[通俗易懂]

    pycharm最新激活码2021 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号