springmvc處理文件無法上傳問題

一、問題現象:

1、用postman 上傳文件一直報400、500錯誤,請求截圖如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
2、當header設置爲 multipart/form-data 請求始終無法到達接口

二、問題排查過程

1、首先我根據返回的400或500 的錯誤碼在網上搜索,查詢排查結果。 其搜索到的結果基本上是讓檢查spring-mvc配置文件中,file類型的解析handler 有沒有問題。 我確認了我的配置沒有問題。 如圖:
在這裏插入圖片描述
2、我開始懷疑, 我是否引入了jar , 我確認了。 jar已經引入,如下圖:
在這裏插入圖片描述
懷疑是jar版本問題, 我升級到最新jar,問題依然沒有解決。 暫時排除jar版本的問題。
3、我懷疑是我們系統集成的統一登錄授權系統,過濾到了相應的數據,於是我debug,統一登錄授權系統的filter。在debug的時候發現了一個奇詭的現象,剛進入filter的 ServletRequest 請求是有, file類型文件的, 其它的請求參數也有, 頓時,看到了一點希望的曙光,至少數據有傳到後臺來,排除postman構造請求參數的問題,但是運行了幾行代碼後我發現,ServletRequest 沒有了file文件,及其它參數。
在這裏插入圖片描述
好幾次debug發現問題原因是:是由於ServletRequest 被強制轉換爲HttpServletRequest,在未轉換前應該是MultipartHttpServletRequest,轉換後導致multipart/form-data 請求的數據全部丟失。問題點如下圖:
在這裏插入圖片描述
附上查看的代碼:org.apache.commons.io.IOUtils.toString(request.getInputStream())
4、原本以爲找到了最終的原因,於是註銷掉了統一登錄授權的filter,結果依然報400錯誤。 這次真的懵逼了。 於是我開始檢查Controller,從error內容中可以看出, 是數據沒有被綁定到相應的Controller上。 一下是有問題的寫法:
在這裏插入圖片描述
5、開始在網上查閱資料,最後發現,spring在綁定請求參數的時候只能綁定一個對象, 而我有兩個對象。於是去掉一個對象發現 請求居然進到了相應的接口, HttpServletRequest 中也有了相應的參數。 於是我將所有參數都分開接受。如下圖:
在這裏插入圖片描述

三、總結

這次問題排查了一整天,多數時間在網上查閱資料和嘗試,我覺得這樣處理問題的效率太低了。 處理問題還是得從原理出發,然後看源代碼,debug。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章