Spring4.x 遇到ajax-json返回406错误

上班的时候遇到个问题,在spring4.3的web 项目中,想使用了springmvc的注解,把返回的对象自动转换成json 返回。结果在访问时出现406 ,Not Acceptable错误。上网搜索了好多答案,均不能解决问题。

一、问题分析:

1.检查Controller 中的方法是否加了 @ResponseBody 注解。(已添加)

2.检查ajax 函数是否没写 dataType:'json' 。

3.检查springmvc关于支持json数据的处理。

 <!-- 处理请求response返回值,如下配置能正确返回字符串型返回值,如返回值为对象,则自动转为json -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>application/json; charset=UTF-8</value>
                <value>text/html; charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <bean id="mappingStringHttpMessageConverter"
        class="org.springframework.http.converter.StringHttpMessageConverter" />

    <bean id="handleAdapter"
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
            </list>
        </property>
    </bean>

4.检查 jacson的jar包是否已经添加。

以上配置都已添加,那么问题在哪里呢?

二、问题探究

通过查阅资料发现:

1.springMVC3.x 和springMVC4.x所依赖的jackson的jar包有所变更:

3.x:

<span style="white-space:pre">	</span><dependency>  
            <groupId>org.codehaus.jackson</groupId>  
            <artifactId>jackson-core-lgpl</artifactId>  
            <version>1.8.1</version>  
         </dependency>  
        <dependency>  
            <groupId>org.codehaus.jackson</groupId>  
            <artifactId>jackson-mapper-lgpl</artifactId>  
            <version>1.8.1</version>  
        </dependency>


4.x将使用全新的jackson-annotations-2.7.0.jar,jackson-core-2.7.0.jar,jackson-databind-2.7.0.jar 原有的jar不再使用

<dependency>
              <groupId>com.fasterxml.jackson.jaxrs</groupId>
              <artifactId>jackson-jaxrs-xml-provider</artifactId>
              <version>2.5.2</version>
        </dependency>

        <dependency>  
            <groupId>com.fasterxml.jackson.core</groupId>  
            <artifactId>jackson-core</artifactId>  
            <version>2.5.2</version>  
        </dependency>  

        <dependency>  
            <groupId>com.fasterxml.jackson.core</groupId>  
            <artifactId>jackson-databind</artifactId>  
            <version>2.5.2</version>  
        </dependency>  

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.5.2</version>
        </dependency>

2:仔细检查发现:springMVC.xml头文件上的xsi:schemaLocation里版本显示的还是3.x,这里手动改成4.x。

3:spring4.x关于json的配置方式有所变更(重点)

3.x

<mvc:annotation-driven />
    <!-- 处理请求response返回值,如下配置能正确返回字符串型返回值,如返回值为对象,则自动转为json -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>application/json; charset=UTF-8</value>
                <value>text/html; charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <bean id="mappingStringHttpMessageConverter"
        class="org.springframework.http.converter.StringHttpMessageConverter" />

    <bean id="handleAdapter"
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
            </list>
        </property>
    </bean>

4.x
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="false" />
    </bean>
    <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>  

    <bean id="stringConverter"  
        class="org.springframework.http.converter.StringHttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>  
                <value>text/plain;charset=UTF-8</value>  
            </list>  
        </property>  
    </bean>  

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="messageConverters">  
            <list>  
                <ref bean="stringConverter" />  
                <ref bean="jsonConverter" />  
            </list>  
        </property>  
    </bean>  


三、问题解决

通过修改以上配置信息后,问题解决。我按照上面的配置以后406错误不见了,但是返回结果是xml格式,去掉了

<pre name="code" class="html"><dependency>
              <groupId>com.fasterxml.jackson.jaxrs</groupId>
              <artifactId>jackson-jaxrs-xml-provider</artifactId>
              <version>2.5.2</version>
        </dependency>

 依赖以后,正常返回 json格式数据了。 

四、分析总结

1.头文件信息要与使用的spring版本一致。

2.spring3.x 和spring4.x 处理返回json 用到的jar包不一样。

3.springmvc 的配置不一样。

五、感谢

这个问题上网查了很多答案均不能解决我的问题,最后看到了

http://blog.csdn.net/a116475939/article/details/50588364

问题得到了解决。这是我第一写的第一篇博客(转载),希望能帮助到遇到同样问题的筒子。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值