最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC @RequestBody出現(xiàn)400 Bad Request的解決

 更新時間:2023年04月10日 14:44:30   作者:苦作舟  
這篇文章主要介紹了SpringMVC @RequestBody出現(xiàn)400 Bad Request的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@RequestBody出現(xiàn)400 Bad Request的問題

今天與同事調(diào)試一個接口,發(fā)現(xiàn)后臺使用@RequestBody老是獲取不到數(shù)據(jù)。查了網(wǎng)上很多資料,要使用@RequestBody來轉(zhuǎn)換JSON字符串為對象

大概是以下幾個點

1. 請求的Content-Type要是application/json

2. 請求的類型要是POST

3. 前臺json傳遞的key在后臺的實體對象中存在,也就是JSON要與實體對象要對應,并且名稱要一致(如果不一致可以使用@JsonProperty來做映射)

以上這些我基本都檢查過了,都沒有問題,但是程序根本就不會進入接口方法,詳細檢查了前端傳送到后臺確實 application/json類型的數(shù)據(jù)。

如下:

POST /quickstart/api/v1/dataSync/syncUser HTTP/1.1
Content-Length: 67
Host: 192.168.1.231:9090
Content-Type: application/json

{"username": "1111","password": "e10adc3949ba59abbe56e057f20f883e"}

HTTP/1.1 400 Bad Request
Content-Length: 0
Server: Jetty(7.6.15.v20140411)

SpringMVC也沒有拋出任何錯誤,于是在接口Controller加入以下異常處理代碼來確定異常信息:

@ResponseBody
?? ?@ResponseStatus(HttpStatus.BAD_REQUEST)
?? ?@ExceptionHandler(HttpMessageNotReadableException.class)
?? ?public void messageNotReadable(HttpMessageNotReadableException exception, HttpServletResponse response){
?? ??? ?//調(diào)試作用,用來調(diào)試前臺傳遞json后臺無法正確映射問題
?? ??? ?
?? ??? ?logger.error("請求參數(shù)不匹配。", exception);
?? ? ? ?
?? ?}

終于后臺打印出錯誤信息如下:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: org.eclipse.jetty.server.HttpInput@42f0d7f3; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) ~[jackson-databind-2.4.0.jar:2.4.0]
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3095) ~[jackson-databind-2.4.0.jar:2.4.0]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3036) ~[jackson-databind-2.4.0.jar:2.4.0]

但是還是找不到問題所在,最后無意發(fā)現(xiàn)前面有一段測試代碼(因為程序一直無法進入Controller的接口方法,所以我在Spring攔截器中加了一段代碼),測試前端傳過來的JSON數(shù)據(jù)的內(nèi)容。也就是這段代碼導致了這一切。

@Override
?? ?public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
?? ??? ?BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
?? ??? ?StringBuffer buffer = new StringBuffer(); ?
?? ??? ?String line = " "; ?
?? ??? ?while ((line = reader.readLine()) != null){ ?
?? ??? ? ? ? buffer.append(line); ?
?? ??? ?} ?
?? ??? ?System.out.println(buffer.toString());

查看文檔,發(fā)現(xiàn)HttpServletRequest.getInputStream(),一般只能被調(diào)用一次,在request.getinputstream讀取一次后position到了文件末尾,第二次就讀取不到數(shù)據(jù),由于無法reset(),所以,request.getinputstream只能讀取一次。

做了幾年程序第一次知道HttpServletRequest.getInputStream()只能被讀取一次,真是學藝不精啊。

post 400 (Bad Request)異常怎么排查參數(shù)

問題描述

用ajax請求時報post 400 (Bad Request)的異常,前臺js參數(shù)JSON.stringify(data),后臺controller 中@RequestBody XX xx(javabean)接收參數(shù)。

通常發(fā)生400時,即使在后臺方法上設置斷點,但因400是參數(shù)由json轉(zhuǎn)換成Javabean時發(fā)生異常,所以不會進入斷點。

此時如果單靠眼力一一排查參數(shù)中的每個值,簡直能把眼瞅瞎……還未必能找到……

解決辦法

辦法一:

從大牛那取經(jīng),可以org.springframework.web.servlet.DispatcherServlet中設置斷點,好像是doService方法,下次再遇到自己打算試試。

辦法二:

自己找到了一個low但比較簡單直觀的辦法,哈哈

1.瀏覽器F12,調(diào)試狀態(tài)下在network/網(wǎng)絡找到400(Bad Request)的請求,復制出該post請求的json格式的請求參數(shù)。

以chrome為例,點擊“view source”會顯示json字符串格式的參數(shù)。

2.在后臺方法中將該json字符串轉(zhuǎn)換成JSONObject,再將JSONObject轉(zhuǎn)換成實體XX。

代碼:

com.alibaba.fastjson.JSONObject.toJavaObject(
		(com.alibaba.fastjson.JSONObject)(com.alibaba.fastjson.JSONObject.parse("{'ts':1493184921039,'pk':nulll}")),XX.class)

其中的{'ts':1493184921039,'pk':nulll}是請求參數(shù)字符串(將雙引號改成單引號),JSONObject.parse()方法將其轉(zhuǎn)換成JSONObject格式;JSONObject.toJavaObject()是轉(zhuǎn)換為實體XX的方法。

3.運行代碼,就會報錯,錯誤中會提示那些參數(shù)有問題,進而修改就可以啦。

到目前為止遇到過兩次參數(shù)的問題,一次是時間戳ts的格式導致400的,當時ts是是由net.sf.json.JSONObject處理過返回給前臺頁面的,等到再將包含該ts的實體json串傳給后臺時就因無法轉(zhuǎn)換為實體報錯了。

第二次就是現(xiàn)在因為實體中的一個屬性是空值,而實體類中該屬性的set方法對該屬性值進行了特殊處理,卻又未判空導致了空指針異常。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)自定義中文排序的方法機注意事項

    Java實現(xiàn)自定義中文排序的方法機注意事項

    在Java中,中文排序通常涉及到使用Collator類來處理字符串的比較,確保根據(jù)漢字的拼音順序進行排序,本文給大家介紹了Java實現(xiàn)自定義中文排序的方法機注意事項,并有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-10-10
  • java使用Cookie判斷用戶登錄情況的方法

    java使用Cookie判斷用戶登錄情況的方法

    這篇文章主要為大家詳細介紹了java使用Cookie判斷用戶登錄情況,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • SpringCloud解決feign調(diào)用token丟失問題解決辦法

    SpringCloud解決feign調(diào)用token丟失問題解決辦法

    在feign調(diào)用中可能會遇到如下問題:同步調(diào)用中,token丟失,這種可以通過創(chuàng)建一個攔截器,將token做透傳來解決,異步調(diào)用中,token丟失,這種就無法直接透傳了,因為子線程并沒有token,這種需要先將token從父線程傳遞到子線程,再進行透傳
    2024-05-05
  • 將Bean注入Spring容器中的常用方式分享

    將Bean注入Spring容器中的常用方式分享

    在Spring框架中,有多種方式可以將Bean(即對象)放入Spring容器中,這篇文章就給大家介紹一些常用的方式,文中有詳細的代碼示例,感興趣的同學可以參考閱讀下
    2023-06-06
  • springboot將lib和jar分離的操作方法

    springboot將lib和jar分離的操作方法

    本文介紹了如何通過優(yōu)化pom.xml配置來減小Spring Boot項目的jar包大小,主要通過使用spring-boot-maven-plugin和maven-dependency-plugin插件,將依賴庫打包到jar中,并通過指定外部lib路徑的方式運行jar,從而減小jar包體積,感興趣的朋友一起看看吧
    2025-02-02
  • ByteArrayOutputStream簡介和使用_動力節(jié)點Java學院整理

    ByteArrayOutputStream簡介和使用_動力節(jié)點Java學院整理

    ByteArrayOutputStream 是字節(jié)數(shù)組輸出流。它繼承于OutputStream。這篇文章主要介紹了ByteArrayOutputStream簡介和使用,需要的朋友可以參考下
    2017-05-05
  • SpringBoot集成MyBatisPlus+MySQL的實現(xiàn)

    SpringBoot集成MyBatisPlus+MySQL的實現(xiàn)

    MybatisPlus是國產(chǎn)的第三方插件, 它封裝了許多常用的CURDapi,免去了我們寫mapper.xml的重復勞動,本文主要介紹了SpringBoot集成MyBatisPlus+MySQL的實現(xiàn),感興趣的可以了解一下
    2023-10-10
  • 使用Java實現(xiàn)串口通信

    使用Java實現(xiàn)串口通信

    這篇文章主要為大家詳細介紹了使用Java實現(xiàn)串口通信的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 如何解決java:錯誤:無效的源發(fā)行版:17問題

    如何解決java:錯誤:無效的源發(fā)行版:17問題

    這篇文章主要介紹了如何解決java:錯誤:無效的源發(fā)行版:17問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring Boot2配置Swagger2生成API接口文檔詳情

    Spring Boot2配置Swagger2生成API接口文檔詳情

    這篇文章主要介紹了Spring Boot2配置Swagger2生成API接口文檔詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

龙门县| 南昌市| 曲沃县| 家居| 东源县| 济源市| 陆良县| 瓮安县| 安陆市| 天全县| 县级市| 阜新| 固镇县| 聊城市| 张家港市| 通州区| 德昌县| 尤溪县| 尤溪县| 普定县| 通城县| 宜昌市| 庆元县| 桃江县| 泰来县| 板桥市| 北海市| 南安市| 抚顺县| 柏乡县| 游戏| 资兴市| 龙州县| 泰和县| 镇江市| 宿迁市| 长白| 新河县| 贵德县| 金坛市| 安顺市|