解決@RequestBody接收json物件報錯415的問題
@RequestBody程式設計客棧接收json物件報錯415
前端請求:
$.ajax({ url: basePath() + "/index/login.do",type : "post",data: JSON.stringify(form),dataType : "json",contentType : "application/json;charset=utf8",success: function (data) { console.log(data); },error: function () { } });
後端接收:
@ResponseBody @RequestMapping(value = "/login",method = RequestMethod.POST,produces = "application/json;charset=utf8") public JSONObject login(@RequestBody LoginVo loginVo){ JSONObject result = new JSONObject(); UsernamePasswordToken token = new UsernamePasswordToken(loginVo.getUsername(),loginVo.getPassword()); System.out.println(loginVo.isRememberMe()); Subject subject = SecurityUtils.getSubject(); subject.login(token); if (subject.isAuthenticated()){ result.put("result",true); }else{ result.put("result",false); } return result; }
前端ajax請求,後端使用@RequestBody接收,報出415請求資料格式錯誤
錯誤原因:
springMVC無法讀取ajax設定好的dataType並以對應的方式處理請求頭,進而無法處理json資料
解決辦法:
在maven中引入Jackson相關jar包,並在springMVC的xml中引入相關配置,maven和springMVC的相關程式碼如下:
maven:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.6</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.6</version> </dependency>
springMVC:
<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.StringHttpMessageConverter"> <property name = "supportedMe程式設計客棧diaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- json轉換器 --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> http://www.cppcns.com <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> http://www.cppcns.com </bean> </list> </property> </bean>
後端使用@RequestBody接收前端傳來的資料
踩坑①
@RequestBody接收json字串,只能使用post的提交方式
前端直接複製了相似功能頁面的js,該頁面是使用的get的提交方式
但前端報錯500,後端報錯提示
2019-09-12 09:17:43.088 ERROR GlobalExceptionHandler : An exception occurs within the system : Required String parameter ‘xxx' is not present
踩坑②
後將.get(URL,data,callback)修改為.post(URL,callback);
$.post(URL,callback);
必需的 URL 引數規定您希望請求的 URL。
可選的 data 引數規定連同請求傳送的資料。
可選的 callback 引數是請求成功後所執行的函式名
但前端繼續報錯500,後端報錯提示
2019-09-12 09:23:15.409 ERROR GlobalExceptionHandlerhttp://www.cppcns.com : An exception occurs within the system : Content type ‘application/x-www-form-urlencoded;charset=UTF-8' not supported
踩坑③
後端提示不支援Content type 為'application/x-www-form-urlencoded;charset=UTF-8'的格式,百度查了一下.post(URL,callback)只是預配置.ajax呼叫的快捷方式,並不能修改contentType的型別
所以將$.post方法修改為了&.ajax方法
設定
type: “post”,url: ctx + url,data: JSON.stringify(allData),dataType: “json”,contentType:“application/json;charset=utf-8”,
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。