1. 程式人生 > 程式設計 >解決@RequestBody接收json物件報錯415的問題

解決@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”,

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。