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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]

    Ubuntu20.04安装详细图文教程(双系统)[通俗易懂]Ubuntu安装前言最近想把自己开发环境换成linux的,想了一下还是ubuntu比较面向桌面,而且想熟悉使用一下Linux操作系统,决定使用ubuntu。开始了着手查找安装Ubuntu双系统的方法。安装有三种,虚拟机安装、wubi安装和U盘安装。第一种发挥不出硬件本身的性能,尝鲜还行。使用wubi–就是ubuntu提供的一种简便的安装系统方法,但是当时使用一直出错。所以我用了第三种,就出现了这篇博客。一、需要资源U盘一个(提前备份数据)Ubuntu20.04LTS镜像下载地址:清华源

    2022年5月16日
    69
  • 聚类分析的常用算法_聚类算法的基本原理

    聚类分析的常用算法_聚类算法的基本原理原博文:聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。在数据科学中,我们可以使用聚类分析从我们的数据中获得一些有价值的见解。在这篇文章中,我们将研究5种流…

    2022年8月29日
    4
  • insert into select 和 insert into values区别「建议收藏」

    insert into select 和 insert into values区别「建议收藏」INSERTINTOSELECT语句:从一个表复制数据,然后把数据插入到一个已存在的表中。将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECTINTO 和 INSERTINTOSELECT 表复制语句了。1.INSERTINTOSELECT语句语句形式为:InsertintoTable2(field1,…

    2022年7月15日
    26
  • tomcat闪退问题整理

    tomcat闪退问题整理tomcat闪退一般有以下几个原因:1、JDK环境变量配置错误;2、JDK版本与tomcat版本不匹配(一般jdk1.6,tomcat8.**这样可能会出现类似问题)3、tomcat内存配置有误(Catalina文件内存配置有误)4、端口被占用解决方案:1、JDK环境变量配置错误;排查:1)检查环境变量:cmd启动命令行窗口→通过cd命令到tomcat的bin目录下→运…

    2022年5月12日
    38
  • 修改nginx默认端口号_修改http默认端口

    修改nginx默认端口号_修改http默认端口nginx解压目录下的conf目录下的nginx.conf修改对应端口

    2025年10月3日
    5
  • Enterprise Library 3.1 介绍「建议收藏」

    Enterprise Library 3.1 介绍「建议收藏」EnterpriseLibrary3.1是Microsoftpatterns&practicesEnterpriseLibrary的一个新的发行。EnterpriseLibrary是一个应用程序块的集合。这些可重用的软件组件为帮助开发者解决普通企业开发的挑战而设计。这个EnterpriseLibrary发行包括了二个新的应用程序块,一个用于创建应用程序块和提供程序的软

    2022年10月20日
    37

发表回复

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

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