在編寫控制器中的action方法時,spring允許我們使用具體的資料類型定義函數簽名,這是通過propertyeditor實作的。propertyeditor本來是jdk提供的api,用于将文本值轉換成給定的類型,結果spring的開發人員發現它恰好滿足spring的需求——将url參數轉換成函數的參數類型。
針對常用的類型(boolean、currency和class),spring mvc已經提供了很多propertyeditor實作。假設我們需要建立一個isbn類并用它作為函數中的參數。
考慮到propertyeditor屬于工具範疇,選擇在項目根目錄下增加一個包——utils。在這個包下定義isbn類和isbneditor類,各自代碼如下:
isbn類:
isbneditor類,繼承propertyeditorsupport類,setastext完成字元串到具體對象類型的轉換,getastext完成具體對象類型到字元串的轉換。
在bookcontroller中增加initbinder函數,通過@initbinder注解修飾,則可以針對每個web請求建立一個editor執行個體。
修改bookcontroller中對應的函數
運作程式,通過httpie通路<code>http localhost:8080/books/9781-1234-1111</code>,可以得到正常結果,跟之前用string表示isbn時沒什麼不同,說明我們編寫的isbneditor已經起作用了。
spring提供了很多預設的editor,我們也可以通過繼承propertyeditorsupport實作自己定制化的editor。
由于properteyeditor是非線程安全的。通過@initbinder注解修飾的initbinder函數,會為每個web請求初始化一個editor執行個體,并通過webdatabinder對象注冊。