2013-03-20 76 views
4

Im新的DOZER映射推土機映射:多於一個源到目的地

我們可以將來自多個源類的屬性映射到目標嗎?

EG

class A { 
      int a; 
      int b; 
} 

class B { 
    String c; 
} 

class Destination { 
    int a; 
    int b; 
    String c; 
} 

難道是可能的一個映射配置文件來做到這一點?

回答

3

不是直接沒有。您將需要創建一個新的類來包裝你的兩個源類四周,複製從:

class D { 
    private A a; 
    private B b; 
} 

<mapping> 
    <class-a>D</class-a> 
    <class-b>C</class-b> 
    <field> 
    <a>a.a</a> 
    <b>a</b> 
    </field> 
    <field> 
    <a>a.b</a> 
    <b>b</b> 
    </field> 
    <field> 
    <a>b.c</a> 
    <b>c</b> 
    </field> 
</mapping> 

或者你需要從每個源類的目標對象複製兩次,一次,確保不消除現有的領域。

<mapping wildcard="false"> 
    <class-a>A</class-a> 
    <class-b>C/class-b> 
    <field> 
     <a>a</a> 
     <b>a</b> 
    </field> 
    <field> 
     <a>b</a> 
     <b>b</b> 
    </field> 
</mapping> 

<mapping wildcard="false"> 
    <class-a>B</class-a> 
    <class-b>C/class-b> 
    <field> 
     <a>c</a> 
     <b>c</b> 
    </field> 
</mapping> 
+0

wildcard =「false」,每次都會創建一個新對象。 wildcard =「true」複製到同一個對象中。 – VinayVeluri 2013-03-21 07:40:35

+4

通配符選項涉及字段匹配。如果通配符= false,則需要提及應該映射的每個字段。 Wildcard = true將按名稱自動匹配。它不會影響對象的創建。 – Holgzn 2013-09-25 12:34:57

11

您可以只映射兩次。首先,使用Destination.class爲目標,然後使用該結果從第一映射爲目標對象:

A a = new A(); 
    a.setA(1); 
    a.setB(2); 

    B b = new B(); 
    b.setC("3"); 

    Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance(); 

    Destination destination = mapper.map(a, Destination.class); 

    mapper.map(b, destination); 

    System.out.println(destination); 
    // Destination [a=1, b=2, c=3] 

這甚至與空映射配置文件的工作。