解决spring3.0升级到4.2,采用@ResponseBody方式 ajax返回404及406的问题

来源:互联网 发布:程序员笔记本大小 编辑:程序博客网 时间:2024/05/22 00:38

spring3.0升级到4.2之后,遇到了一些很搞的问题,困扰了我很长时间,网上也搜索了很久,没有解决我的问题。不过现在问题解决了,决定分享一下,方便那些遇到跟我一样问题的朋友。

不过也产生了一些新的问题,很希望哪位朋友能给我一些提示。

首先第一个问题就是很经典的404,明明我后台已经进去了,代码也执行完了,并且没有出现任何问题,也正常返回,可是为何ajax代码一直进error,不进success?
于是打印错误信息:
XMLHttpRequest.status:404
XMLHttpRequest.readyState:4
textStatus:error
XMLHttpRequest.readyState=4,表示响应内容解析完成,可以在客户端调用了,这我就更郁闷了,既然不是后台的问题,那么是jquery有问题?。so又在浏览器直接输入url看看能不能返回json串,于是solo了一把,结果把我惊艳了:
这里写图片描述
第一:我返回的是json,它为何是个jsp?第二:我没有这个jsp!第三:这个jsp的名称看起来是我的函数名?好了事已至此看来还是后台的问题,于是问题又回到了后台上,看起来后台没有返回json而是jsp,jsp名称默认为我的函数名,而我又没有这个jsp,所以导致404,那么着重点就放在了为何会出现这种情况。

后来经过坚持不懈的调试以及对比,发现是map的问题,于是修改代码,自己实例化一个map,问题得以解决。具体代码如下:
修改前:
这里写图片描述
修改后:
这里写图片描述
后来经过两个map的对比,发现函数中作为参数传进来的map,比自己实例化的map多两个属性,有图有真相:
这里写图片描述
这里写图片描述
就这么稍微改了下,404头也不回的就走了。由此产生了几个新的问题,第一:是这多出来的两个属性中的哪一个导致的404,第二:为什么会返回html而不是json,这两个问题我还没有搞清楚,非常希望哪位大神来帮忙解答一下

你以为这样就结束了?当然没有,406不期而至,由于404已经差不多耗干了我的脑细胞,所以406一记重拳差点把我打哭,可是木有办法,咬牙接着百度。

406:表示服务器生成的响应无法被客户端所接受,现在说明结果是能正确的返回到正确的页面了,可是又出现这种问题?之前明明是好的啊~~~~!why?tell me why?

百度了好久,总算是发现了一些有用的线索,spring3.1及以后的版本,requestedMediaTypes由[*/*]变成了[text/html],而producibleMediaTypes都是[application/json],可参考http://blog.csdn.net/gbtyy/article/details/17165605

由此可见spring3.1之后的版本,默认的编码方式变成了[text/html],而工程后缀如果为.html,则会采用这种默认的编码方式,此时采用@ResponseBody注解进行json自动转换当然会出现406。并且很不巧的是本人的工程后缀又恰好是.html,简直是可喜可贺!

so,知道原因后解决起来当然简单多了。本人亲身试验的几个解决办法:
第一:在不改变原有的spring-mvc配置文件的情况下,改变你的工程后缀!让.html见鬼去吧。

第二:依然采用.html为后缀,不过要修改<mvc:annotation-driven/>配置,改成:

    <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />       <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">           <property name="favorPathExtension" value="false" />          <property name="favorParameter" value="false" />           <property name="ignoreAcceptHeader" value="false" />           <property name="mediaTypes" >               <value>                  atom=application/atom+xml                  html=text/html                  json=application/json                  *=*/*              </value>           </property>      </bean>

至此问题全部解决!

0 0
原创粉丝点击