@InitBinder註解用於自定義將請求引數型別轉換為控制器的過程。這樣,甚至可以在執行請求之前呼叫該方法,從而有機會預處理請求資料、驗證、格式化或執行任何必要的操作。
類@Controller或@ControllerAdvice類可以具有可以使用@InitBinder進行預處理的方法。對於DataBinder@Controller自定義僅在控制器內本地應用。 For適用於所有控制器。@ControllerAdvice
讓我們使用@InitBinder將請求屬性轉換為型別LocalDate並LocalDateTime作為自定義屬性。
讓我們建立一個名為 的類LocalDateTimeRequestConfig,它將接收註釋@ControllerAdvice並具有一個用 註釋的方法@InitBinder,如下所示:
@ControllerAdvice |
使用WebDataBinder引數,我們將使用registerCustomEditor().對於我們的示例,我們將為 建立一個轉換器LocalDate,如下所示:
binder.registerCustomEditor( |
我們將為該型別新增轉換器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 可以從控制器內的請求中移除重複的型別轉換程式碼,並將其集中到一個類中,從而提高程式碼的質量和可維護性。