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)


相关推荐

  • 跨平台数据整合系统_lvc异构系统

    跨平台数据整合系统_lvc异构系统1.muleESB整合系统四种模式A.简单服务模式属于几个webService之间的同步调用,请求响应处理模式。B.桥接模式C.校验器模式校验器模式通过定义一个校验过滤器过滤服务请求,并同步返回

  • 【STM32】STM32CubeMX教程二–基本使用(新建工程点亮LED灯)

    【STM32】STM32CubeMX教程二–基本使用(新建工程点亮LED灯)前言在配置好CubeMX之后,就是新建工程的开始了,那么首先我们需要一些准备,本片博客我们会很详细的介绍STM32CubeMx的基本使用和如何创建一个新的工程并且点亮LED灯面向初学者如果您想着快速实现工程的创建,可以直接跳过功能介绍,观看工程创建一栏并且,在新建工程时,我们分为了具体流程1~7如果您不想看每部分的讲解,直接按照流程操作即可,5分钟即可成功点亮LED灯安装…

  • vmware15最新激活码2021_在线激活

    (vmware15最新激活码2021)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • oracle创建数据库实例失败_oracle数据库实例名是什么

    oracle创建数据库实例失败_oracle数据库实例名是什么Oracle数据库实例的创建、删除、修改   以SUSE10SP2、Oracle10gR2为例。      本文中的数据库实例这一称谓应该换做数据库更为准确,数据库可以理解为是一个物理的静态概念,主要包括一些物理存在的数据库文件,而数据库实例则是一个动态概念,包括一些内存区域以及若干进程,数据库实例是对数据库进行操作的执行者。(20090714修改)   安装完Ora

  • 数组转对象,对象转数组对不对_对象数组初始化

    数组转对象,对象转数组对不对_对象数组初始化<scripttype=”text/javascript”>//数组转对象vara=[1,2,3,4]varobj={…a}//{0:1,1:2,2:3,3:4}varobj2={}a.forEach((item,index)=>{obj2[index]=item})//{0:1,1:2,2:3,3:4}functiontoObj(a.

  • ServletContextListener作用[通俗易懂]

    ServletContextListener作用[通俗易懂]ServletContext被Servlet程序用来与Web容器通信。例如写日志,转发请求。每一个Web应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的ServletContext的最大应用是Web缓存—-把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。Serv…

发表回复

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

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