Spring版本4.0.2.RELEASE
1 问题
使用springMVC进行JSON请求时,返回报406错误。使用chrome捕获的错误截图如下:
下面是工程的部分代码,已经做过一些精简。
Js代码:
$(form).ajaxSubmit({ url: 'sysinfo/login', cache: false, success: function(data,textStatus) { if(data.resultCode == '200'){ location.href = "index"; }else{ alert(data.resultMessage); } }, error: function(XMLHttpRequest,textStatus,errorThown) { alert(“error”); } });后台代码:
@Controller @RequestMapping("/sysinfo") public class SysLoginController { @RequestMapping(value = "/login", method = RequestMethod.POST) @ResponseBody public ResponseMessage<Object> login(User user) { // new ResponseMessage<Object>( resultCode,resultMessage); ResponseMessage<Object> responseMessage = new ResponseMessage<Object>("200", “登录成功”); return responseMessage; } }
经过debug发现,是可以进入java代码的,return一句返回结果也是预想中的(“200”,”登陆成功”),但是浏览器请求结果总是406。
2 可能产生改问题的原因
2.1 jar包问题
login方法返回JSON,自然涉及到返回对象转换成JSON的问题。如果缺少相应jar包也会产生406问题。解决方案导入jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar。
2.2 @ResponseBody配置问题
若不配置@ResponseBody,Controller默认返回字符串,使用已配置的视图解析器来解析。若配置了@ResponseBody则Controller认为返回的是数据而不是视图。前台请求json,则应该配置@ResponseBody以返回json数据。
@RequestBody/@ResponseBody注解不使用视图解析器,而是使用HttpMessageConverter,因而需要进行相应配置。有以下两种方式:
·配置bean,如http://blog.csdn.net/woshiwanxin102213/article/details/37521303
·使用<mvc:annotation-driven>
2.3 视图数据类型问题
spring 3.2时requestedMediaTypes却为[text/html]的情况报406错误,还有一个原因可能是由于采用的后缀有关,如果使用*.htm,*.html等,默认就会采用[text/html]编码。具体案例见http://blog.csdn.net/jia20003/article/details/21411771
3 本项目所做修正
针对以上几个问题,本项目中使用如下配置:
Jar包依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.4.1.3</version> </dependency>
配置@ResponseBody和<mvc:annotation-driven>
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg ref="utf8Charset" /> </bean> </mvc:message-converters> </mvc:annotation-driven>
视图解析配置
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> <property name="contentType" value="text/html;charset=UTF-8" /> </bean>
经过了对问题的各种排查和修改,终于。。。还是406(not Acceptable)!!
最后在http://stackoverflow.com/questions/7462202/spring-json-request-getting-406-not-acceptable#中得到了解决。也是产生该问题的另一个原因,返回类型ResponseMessage中没有补全Getters and Setters。针对该对象补全所有属性的get和set方法,重新执行请求,返回数据正常。
这种微小的错误很难排查,也是在今后的开发中是应该避免的。