核心提示:使用springmvc@response返回json报错4061. 需求: 通过 ajax 请求上传文件, 到 controller处理完后, 返回一个封装了结果信息的 VO2. 所踩的坑: 可以正常...
使用springmvc@response返回json报错406
1. 需求: 通过 ajax 请求上传文件, 到 controller处理完后, 返回一个封装了结果信息的 VO
2. 所踩的坑: 可以正常访问 controller, 正常处理完成后 return vo; 看了浏览器 firebug 的 network 访问记录, response状态是406
以下是代码:
// 文件上传 function uploadExcel() { // 文件上传 var filename = $("#excelFile").val(); if (filename) { var reg_csv = /[^\.](\.csv)$/i; if (reg_csv.test(filename)) { $(this).attr('disabled', true); $("#uploadExcel").attr('disabled', true); $("#uploadExcel").attr('class', 'btn gray'); var formData = new FormData(); formData.append("excelFile", $("#excelFile")[0].files[0]); $.ajax({ url : "fileAddGive.htm", type : "POST", data : formData, processData : false, contentType : false, success : function(responseStr) { if (responseStr.code == "0001") { $.dopAlert(responseStr.msg); } else if (responseStr.failList && responseStr.failList.length > 0) { $.dopAlert("文件导入完成,失败[" + responseStr.failList + "]"); } }, error : function(responseStr) { $.dopAlert("导入失败:未知异常"); } }); searchAll.fnDraw(); } else { $.dopAlert('格式不正确,只支持 .csv 类型文件'); // 启用按钮,清空文件选择框内容 $("#btn-delete-promotionFile").click(); $("#uploadExcel").attr('disabled', false); $("#uploadExcel").attr('class', 'btn blue'); } } else { $.dopAlert('没有找到你需要上传的文件'); } }
以下是 controller:
/** * 文件导入新增充值数据 */ @RequestMapping(value = "/fileAddGive",produces="application/json") @ResponseBody public ReqResultVo fileAddGive(@RequestParam("excelFile") MultipartFile excelFile) { ReqResultVo resultVo = new ReqResultVo(); 省略代码逻辑 return resultVo; }
以下是 web.xml 的 springmvc 的配置
<servlet> <servlet-name>sample</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:conf/spring/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>sample</servlet-name> <url-pattern>*.htm</url-pattern> <url-pattern>*.json</url-pattern> <url-pattern>*.do</url-pattern> </servlet-mapping>
百度了很久,尝试了很多种解决方法,如常见的在 pom 中加 jackson 的依赖,在 springmvc 的注解开启中加 json 的支持,这两种方式能正常访问 controller ,但是没有解决问题.
在@ requestMapping注解上加 produces="application/json" ,这样导致在进入方法之前就报错406
解决方法:
最终尝试把ajax的访问路径url 以 .json结尾,竟然返回成功200,很是不懂,
猜测可能是因为url加上后缀 htm 后, springmvc 会默认把response 的 contentType 设置为text/html