Spring Boot 引數轉換

那夜的星空分外清澈發表於2020-09-24

在 Spring MVC 中,使用註解 @RequestMapping 修飾控制器時,其所配置的內容,會在工程的啟動階段儲存到處理器對映(HandlerMapping)機制中,當請求連線被攔截後,HandlerMapping 進行匹配,會將對應的處理器和攔截器儲存到 HandlerExecutionChain 物件中,並返回給 DispatcherServlet 執行。

處理器中包含了控制器,在執行控制器中匹配的方法前,需要先將請求報文中的引數轉換為控制器所需要的引數。

  1. 不使用任何註解,控制器的引數名稱需要和請求連結中的引數名稱保持一致,如此引數可以正常傳遞,並且控制器的引數預設是可以為空的,所以請求連結中的引數可以是預設的。

  2. 當前後端的引數名稱不一致時,可以使用 @RequestParam 註解將兩者對映起來,並且預設引數是非空的,但是可以使用註解中的 required 屬性修改引數的必要性。

  3. 如果控制器的引數是陣列,那麼請求連結中的相應引數中的元素可以直接使用逗號分隔,如 http://127.0.0.1/testArray?value=1,2,3

  4. 使用 @RequestBody 註解修飾控制器的引數,從而可以獲取請求報文體中的 JSON 引數。

  5. 使用 @PathVariable 註解獲取請求連結路徑中的引數,這個需要修飾控制器方法的註解使用 {<引數名稱>} 佔位符表明引數的位置和名稱。

  6. 對於日期和數字,可以使用 @DateTimeFormat@NumberFormat 進行修飾,從而指定控制器引數的格式。

  7. 如果需要,可以自定義引數轉換規則。

    如同使用 @RequestBody 修飾了引數的控制器,處理器會呼叫 HttpMessageConverter 介面中宣告的方法對請求體資訊進行轉換。

    Spring MVC 中宣告瞭三個介面來實現各種引數的轉換,分別如下:

    • Converter,普通轉換器,可以轉換字串,數字等簡單型別的引數
    • Formatter,格式化轉換器,可以格式化日期,數字等引數
    • GenericConverter,陣列轉換器,可以將請求中的引數轉換為陣列

    在 Spring Boot 中,自動配置類 WebMvcAutoConfiguration 中的 WebMvcAutoConfigurationAdapter 內部類,會自動將上面三種型別的 Bean 註冊到服務類中。所以,只要實現上面的幾個介面,就可以自定義自己的引數轉換器。

相關文章