原因
1。.html 结尾请求
因为spring 3.x(具体哪个版本忘记了)开始,对request里的header 中的accept(也就是mimetype)进行了识别,如果你指定了拦截后缀,比如你原先的.html,那么不管你是ajax还是平常的页面访问,都会当作text/html处理,而你通过ajax访问并不是text/html,而是application/json(可能是类似的),于是spring mvc给你报了个406错误。
2。 @ResponseBody返回JSON格式()
@ResponseBody & @RequestBody
@RequestBody 将 HTTP 请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。
@ResponseBody 将内容或对象作为 HTTP 响应正文返回,使用@ResponseBody将会跳过视图处理部分,
而是调 用适合HttpMessageConverter,将返回值写入输出流。
@ResponseBody可以标注任何对象,由Srping完成对象——协议的转换
我们看到,短短几行配置。使用@ResponseBody注解之后,Controller返回的对象 自动被转换成对应的json数据,在这里不得不感叹SpringMVC的强大。
Spring默认ContentNegotiationManager使用org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy解析可接受的media type,这貌似是Spring 3哪个版本以后开始的特性,因为我的的url-pattern 是*.htm格式的,于是解析出来能accept的media type只有text/html,自然报错。
处理
首先添加jsckson包
引入Jackson-Annotations-2.4.6.jar,Jackson-core-2.4.6.jar,Jackson-databind-2.4.6.jar三个jar包,这样在使用
@ResponseBody注解时才会自动帮你打包成json格式。
1(没试过)
在spring-servelt中添加
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
这两个bean处理请求映射的,在bean中默认会创建一个使用HeaderContentNegotiationStrategy的ContentNegotiationManager,这样就能解析htttp请求头Accept中的类型了。但要注意的是,上述两个bean要定义在<mvc:annotation-driven/>
之前。为什么呢?因为<mvc:annotation-driven/>
会注册RequestMappingHandlerMapping, RequestMappingHandlerAdapter以及 ExceptionHandlerExceptionResolver等等的东西,如果上述两个bean定义放在<mvc:annotation-driven/>
之后就不起作用了。
2 (尝试了spring 4.04, 4.39 成功)
<!-- 默认的注解映射的支持 ,它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter -->
<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>