完成自定義轉換器需要實作以下三個中的任意一個接口:<code>convertor<s,t></code>、genericconvertor或convertorfacoty。下面我們對這些接口進行逐一分析:
這是最為簡單的一個接口,定義了從源類到目标類的轉換方法。該接口的定義如下
genericconvertor會根據源類對象及目标類對象所在宿主類的上下文資訊進行類型轉換工作,該接口的定義如下:
我們常使用其實作類接口:
它除了實作genericconverter,還實作了另一個“條件轉換器”:
在實際開發中,我們能實作此接口自定義轉換器,來根據具體類型上下文來靈活配置我們的類型轉換
這是一個将我們源類轉換為一個目标類或其子類的”多轉換器共存“接口工廠。它的定義如下:
這個接口一個常見的實作類是stringtonumberconvertor,能将string類型資料轉換為number類型或其子類:long,integer,double等。
conversionservice則是spring類型轉換體系的核心接口,conversionservice接口的定義如下:
實作以上類型完成我們的自定義轉換器定義後,我們還要在spring容器中通過conversionservicefactorybean注冊建立後才能使用。
conversionservicefactorybean建立了我們的conversionservice很多内置轉換器,利用這些轉換器,我們可以完成大部分常見的類型轉換工作
而如果我們想使用自定義的類型轉換器,可以通過conversionservicefactorybean的convertor屬性來注冊。
通過以上的分析,我們接下來嘗試自定實作convert
在控制層,我們通過以下方法測試我們的轉換器
啟動伺服器,在遊覽器中通路[項目根路徑]/convert?user=11,myusername,mypassword。
控制台會列印資訊:user [id=11, username=myusername, password=mypassword]。即springmvc幫我們完成了字元串到user類型的轉換。**這裡需注意的是,我們的請求參數名”user”是和控制層方法入參變量user user像對應的,才能完成參數綁定進而轉換類型
在執行個體1的基礎上,我們添加user的一個子類:superuser,作為”super”子類,它擁有了自己的專屬名字,我們将字元串”11,myusername,mypassword,myname“轉換為我們的superuser對象,下面相對應的自定義轉換器和pojo類
除了配置上面的轉換器,還需自定義我們的轉換器工廠,在轉換器工廠中,我們根據目标類型是user還是其子類superuser來調用相應的自定義轉換器:
在執行個體1的基礎上,我們添加一個新方法
運作伺服器,我們在遊覽器中輸入:
1. root/convert?user=10,myusername,mypassword
控制台輸出:user [id=10, username=myusername, password=mypassword]
2. root/convertsuper?superuser=11,myusername,mypassword,myname
控制台輸出:superuser [name=myname, tostring()=user [id=11, username=myusername, password=mypassword]]
我們根據入參類型,并通過convertfactory,完成對同一系列(某一類及其子類)的類型轉換