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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127436.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 达梦数据库备份实操「建议收藏」

    达梦数据库备份实操「建议收藏」达梦数据库备份方式:物理备份,逻辑备份物理备份 冷备:(dmap服务打开的状态下,数据库是关闭的) 热备:(dmap服务一定是打开的,数据库是打开的,数据库要开归档) 逻辑备份 导入导出:dexpdimp 集群:数据守护(dw),DSC(RAC) 达梦支持第三方的备份工具:如第三方备份一体机备份首先要开归档 SQL>alterdatabasemount;#mo…

  • 数据库关系代数除法意义_关系代数运算除法

    数据库关系代数除法意义_关系代数运算除法除法运算的定义:这个概念的描述的非常抽象,刚开始学习的同学完全不知所云。这里通过一个实例来说明除法运算的求解过程设有关系R、S如图所示,求R÷S的结果求解步骤过程:第一步:找出关系R和关系S中相同的属性,即Y属性。在关系S中对Y做投影(即将Y列取出);所得结果如下第二步:被除关系…

    2022年10月24日
  • nginx负载均衡的5种策略及原理

    nginx负载均衡的5种策略及原理nginx的upstream目前支持的5种方式的分配1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 upstreambackserver{ server192.168.0.14; server192.168.0.15; } 2、指定权重指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 upst…

  • Atitit.列表页and查询条件的最佳实践(1)——设定搜索条件and提交查询and返回json数据

    Atitit.列表页and查询条件的最佳实践(1)——设定搜索条件and提交查询and返回json数据

  • 不能读取文件“itunes.library.itl”因为它是由更高级别的itunes所创建的

    不能读取文件“itunes.library.itl”因为它是由更高级别的itunes所创建的转自:https://zhidao.baidu.com/question/80796363.html

  • MySQL 实现行转列SQL

    MySQL 实现行转列SQL概述好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。问题链接:关于Mysql的分级输出问题情景简介学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据表里面数据如下图,使用姓名+课程作为联合主键(有些需求可能不需要联合主键)。本文以MySQL为基础,其他数据库会有些许语法不同。数据库表数据:处理后的结果(行转列):方法一:这里可以使用Max,也可…

发表回复

您的电子邮箱地址不会被公开。

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