dozer是一個優秀的對象映射的架構,可以幫助程式員減少大量的對象之間映射的get/set代碼,在ata上有好幾篇文章介紹了dozer的使用:
<a href="http://www.atatech.org/articles/31144">dozer開發手冊</a>
我在開發背景系統中,經常會遇到從前台送出的對象,轉為背景的服務模型對象做操作,通過dozer工具,靈活的配置就可以輕易的解決。我需要将将一個對象的map對象轉為json的字元串,按照dozer的文檔需要編寫自定義的convertor來進行處理(這裡面針對字段的轉換,,dozer支援類級别,字段級别的convertor. ),但測試卻發現了一些問題。具體請看例子:
源對象
從結果上,我是期望傳入的map對象自動可以轉為json的字元串進行處理,但是跑了單元測試執行的結果是不通過。
我在自定義的轉換器jsonconverter類的convertto方法中加了斷點,發現了傳入的源對象是一個空值:
為什麼明明有map對象設定,到自定義轉換器哪裡就為空了。于是從dozer的map方法開始debug:
實際是調用了mappingprocessor做映射處理,
擷取每個字段的值:
從斷點顯示的值看,這裡取到的就是null了。
問題就應該出在 srcfieldvalue = fieldmapping.getsrcfieldvalue(srcobj);
fieldmap有多個對象實作類,
,在這裡需要檢視mapfieldmap擷取對象。
,預設設定map和字段做映射的時候,會将map作為對象,調用get方法,以配置的字段名作為key擷取值,在這個場景就是map.get("field")取值,是以取到的為空。
解決方案其實很簡單,更改配置映射檔案加上java.util.hashmap
重新執行後:
由于getsrchintcontainer() 不為空,會執行到标紅的邏輯,即直接從對象中擷取map的字段作為值傳回,