Spring中@InitBinder將請求引數轉換為各自的型別

banq發表於2024-05-08

@InitBinder註解用於自定義將請求引數型別轉換為控制器的過程。這樣,甚至可以在執行請求之前呼叫該方法,從而有機會預處理請求資料、驗證、格式化或執行任何必要的操作。

類@Controller或@ControllerAdvice類可以具有可以使用@InitBinder進行預處理的方法。對於DataBinder@Controller自定義僅在控制器內本地應用。 For適用於所有控制器。@ControllerAdvice

讓我們使用@InitBinder將請求屬性轉換為型別LocalDate並LocalDateTime作為自定義屬性。

讓我們建立一個名為 的類LocalDateTimeRequestConfig,它將接收註釋@ControllerAdvice並具有一個用 註釋的方法@InitBinder,如下所示:

@ControllerAdvice 
public  class  LocalDateTimeRequestConfig { 

  @InitBinder 
  public  void  initBinder (WebDataBinder binder) { 
    <font>// 自定義編輯器實現<i>
  } 
}

使用WebDataBinder引數,我們將使用registerCustomEditor().對於我們的示例,我們將為 建立一個轉換器LocalDate,如下所示:

binder.registerCustomEditor(
  LocalDate.class,
  new PropertyEditorSupport() {
    @Override
    public void setAsText(String localDateAsString) throws IllegalArgumentException {
      setValue(LocalDate.parse(localDateAsString));
    }
  } <font>// PropertyEditorSupport() method<i>
);


我們將為該型別新增轉換器LocalDateTime,最終的實現如下所示:

@ControllerAdvice
public class LocalDateTimeRequestConfig {

  @InitBinder
  public void initBinder(WebDataBinder binder) {
    // convert string into LocalDate type
    binder.registerCustomEditor(
        LocalDate.class,
        new PropertyEditorSupport() {
          @Override
          public void setAsText(String localDateAsString) throws IllegalArgumentException {
            setValue(LocalDate.parse(localDateAsString));
          }
        }
    );
    // convert string into LocalDateTime type
    binder.registerCustomEditor(
        LocalDateTime.class,
        new PropertyEditorSupport() {
          @Override
          public void setAsText(String localDateTimeAsString) throws IllegalArgumentException {
            setValue(LocalDateTime.parse(localDateTimeAsString));
          }
        }
    );
  }
}


現在,表示端點請求的所有物件及其屬性都被標記為LocalDate並將LocalDateTime自動轉換,除了集中在單個類中之外,無需在控制器內部或其他任何地方進行此轉換。

如果您想檢視此類的示例,可以在此處檢視。

結論
在使用 @ControllerAdvice 的情況下,使用 @InitBinder 可以從控制器內的請求中移除重複的型別轉換程式碼,並將其集中到一個類中,從而提高程式碼的質量和可維護性。

相關文章