背景
很基礎的問題,只是專案中有遇到,簡單記錄一下
兩個類似的請求,一個為GET請求,普通傳參方式,一個為POST請求,JSON傳參,用@RequestBody接受,兩者的傳參是同一個物件,其中有個引數updateTime,型別為LocalDateTime
GET請求正常,POST請求會報400
原因
很基礎的問題
GET請求的引數通常透過URL查詢引數傳遞,這意味著所有引數都被視為字串。當這些引數到達後端時,Spring的轉換服務會嘗試將這些字串引數轉換為相應的型別。對於LocalDateTime
這樣的型別,Spring已經註冊了合適的轉換器,能夠將字串自動轉換為LocalDateTime
物件,前提是該字串符合一定的格式規範。
預設情況下,Spring Boot配置了一系列的格式化器和轉換器來處理常見的型別轉換,包括從字串到LocalDateTime
的轉換。這意味著,當你透過查詢引數傳送一個日期時間格式的字串時,Spring能夠識別這個字串並將其自動轉換為LocalDateTime
物件,只要這個字串的格式是可被解析的。
然而,在處理POST請求中的JSON資料時,轉換過程有些不同。POST請求的主體通常包含JSON格式的資料,Spring需要將這個JSON資料反序列化為Java物件。這個過程是由Jackson完成的,而Jackson處理日期時間型別的方式需要明確的配置來指定日期時間的格式,或者使用一些特定的模組如jackson-datatype-jsr310
,後者提供了對Java 8日期和時間API的支援。如果沒有適當的配置或模組,Jackson在試圖將JSON中的日期時間字串反序列化為LocalDateTime
物件時就會遇到問題。
因此,對於GET和POST請求之間的差異主要在於引數的傳遞和處理方式的不同:GET請求中的查詢引數被直接視為字串,並透過Spring的轉換服務處理;而POST請求中的JSON資料則需要透過Jackson進行反序列化,這需要額外的配置或註釋來成功處理日期時間型別的資料。