2016-04-04 42 views
1

我有一個類,讓我們把它稱爲A,帶有一個Map字段,它被轉換爲B類,我將其用於數據庫存儲/檢索,其中該字段映射到字符串。從A到B完美的映射工作。但是,從B到A時,我得到一個IllegalArgument異常,它說它不能將一個String轉換爲一個Map。迷惑了我,因爲Dozer's documentation說這樣做的確如此:通過推土機將字符串映射到地圖

數據類型蓋度由Dozer映射引擎自動執行。目前,Dozer支持以下類型的轉換:(這些都是雙向的)

然後它繼續將字符串列表映射爲可能的事情之一。

我在這裏錯過了什麼,或者我需要做些什麼特別的事情?我的文件看起來像:

public class ClassA { 
    Map<String, String> field; 

    public Map<String, String> getField() { 
     return field; 
    } 
    public void setField(
      Map<String, String> field) { 
     this.field = field; 
    } 
} 

public class ClassB { 
    String field; 

    public String getField() { 
     return field; 
    } 
    public void setField(String field) { 
     this.field = field; 
    } 
} 

<mapping> 
    <class-a>com.fake.company.name.ClassA</class-a> 
    <class-b>com.fake.company.name.ClassB</class-b> 
</mapping> 
+0

非常有趣。可能他們的意思是「映射到地圖」,因爲我沒有看到這個列表中的東西,這絕對有可能。 –

+0

我提出了一個問題 - https://github.com/DozerMapper/dozer/issues/283。很明顯,映射至少不是自動的。 –

+0

@ShireResident不確定這是否值得馬蒂指出的問題,解決方案是簡單地明確聲明該字段。 – Atocil

回答

1

Map Based Properties sectionclasses used in documentation)似乎明確地映射領域是必需的,因爲字段名稱將用作地圖的關鍵。

<mapping> 
    <class-a>com.fake.company.name.ClassA</class-a> 
    <class-b>com.fake.company.name.ClassB</class-b>  
    <field> 
    <a>field</a> 
    <b>field</b> 
    </field> 
</mapping> 

您可以使用不同值的關鍵,像這樣

<a key="someKeyValue">field</a> 

但是,如果你的地圖有幾個鍵值對,你可能需要自定義轉換器(see here for details),否則推土機沒有想法如何從字符串重建原始地圖。

+0

這工作,它不再給我例外,事實上它確實重建地圖,即使有多個鍵值對!但是,由於某些原因,現在從Map轉換爲String會導致結果爲null。 – Atocil