InitBinder
註解,用於初始化 WebDataBinder
。這通常在業務控制器中使用,以便在資料繫結到模型物件之前對請求引數進行預處理,例如格式化日期或自定義屬性編輯器。
業務場景:
假設你正在開發一個線上預訂系統,使用者需要輸入日期和其他資訊來預訂服務。你希望確保所有接收到的日期引數都符合特定的格式,並且在使用者沒有輸入日期時提供一個預設值。
1. 建立自定義屬性編輯器:
import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.util.Date; public class DatePropertyEditor extends PropertyEditorSupport { private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); @Override public void setAsText(String text) throws IllegalArgumentException { try { setValue(dateFormat.parse(text)); } catch (ParseException e) { throw new IllegalArgumentException("Invalid date format: " + text, e); } } }
2. 使用 @InitBinder
註解初始化 WebDataBinder
:
import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.stereotype.Controller; @Controller public class BookingController { @InitBinder public void initBinder(WebDataBinder binder) { // 註冊自定義屬性編輯器 binder.registerCustomEditor(Date.class, new DatePropertyEditor()); } // 控制器的其他方法... }
在這個控制器中,@InitBinder
註解的 initBinder
方法用於註冊一個自定義的 DatePropertyEditor
,它將被用來解析和格式化日期引數。
3. 控制器處理預訂請求:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @PostMapping("/booking") public String handleBooking(@RequestParam("bookingDate") Date bookingDate, BookingForm bookingForm) { // 使用 bookingDate 和 bookingForm 中的資料來處理預訂邏輯 // 由於使用了 @InitBinder,bookingDate 已經被格式化為期望的 Date 型別 return "bookingConfirmation"; }
4. 表單 HTML:
<form action="/booking" method="post"> <label for="bookingDate">Booking Date:</label> <input type="text" id="bookingDate" name="bookingDate" required> <button type="submit">Book Now</button> </form>
總結:
@InitBinder
允許開發者在資料繫結到模型之前對請求引數進行預處理,提高了資料的準確性和應用程式的健壯性。使用自定義屬性編輯器,可以自定義如何處理特定型別的資料,例如日期、貨幣或電話號碼。
透過集中初始化
WebDataBinder
,可以簡化控制器程式碼,避免在每個方法中重複相同的初始化邏輯。