Spring MVC 使用ajax请求json数据时出现406 Not Acceptable

今天又遇到一个之前解决过的问题, 但是没有记录而忘记了, 又坑了自己俩小时. 实在该打.
赶紧记下来.
Spring mvc json请求时返回406错误

错误原因有以下几种

  • 忘记加@ResponseBody注解
  • 没有引入json相关实现包, jackson、fastjson等.
  • jackson、fastjson和Spring mvc整合方式不一样, 方式错误.

如果是fastjson必须在mvc配置文件中增加

1
2
3
4
5
6
7
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
</list>
</property>
</bean>

另外必须去掉<mvc:annotation-driven /> 上述配置用于取代此配置. 此方法用于3.0.X的Spring版本.

千万注意 不能使用上述方法!

使用此方法直接初始化AnnotationMethodHandlerAdapter, 会导致webBindingInitializer等属性为空, 从而未来可能引发很多不可预知的问题.
例如webBindingInitializer为空, 就会导致conversionService为空, 从而导致页面传值时转换失效, 比如String to Date报错.
即使加了@DateTimeFormat注解也无效.

如果Spring版本为3.1及以上版本, 则可以用一下方式解决.

1
2
3
4
5
6
7
8
9
10
11
12
13
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
<property name="features">
<array>
<value>WriteMapNullValue</value>
<value>WriteNullStringAsEmpty</value>
</array>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

这两种方式只能任选一种, 不可同时存在, 此方法因为要用到mvc:message-converters这个命名空间, 只有3.1以上版本才支持,
故而不能用于3.0.x的Spring版本.

综上所述, 如果想要使用fastjson, 目前看来必须升级到Spring3.1.x以上版本.

文章目录
  1. 1. 错误原因有以下几种
  • 千万注意 不能使用上述方法!
  • 综上所述, 如果想要使用fastjson, 目前看来必须升级到Spring3.1.x以上版本.
  • ,