Spring Boot專案,LocalDateTime引數在不同傳參方式下的報錯

糖醋小灰發表於2024-05-15

背景

很基礎的問題,只是專案中有遇到,簡單記錄一下

兩個類似的請求,一個為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進行反序列化,這需要額外的配置或註釋來成功處理日期時間型別的資料。

相關文章