Vinay Veluri
Vinay Veluri

Reputation: 6855

Dozer mapping : More than one source to destination

Im new to DOZER mapping

Can we map properties from more than one source class to destination?

EG

class A {
          int a;
          int b;
}

class B {
    String c;
}

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

Can it be possible to do this with one mappings configuration file ?

Upvotes: 4

Views: 13028

Answers (2)

Holgzn
Holgzn

Reputation: 449

You can just map twice. First, use Destination.class as target, then use the Object that resulted from the first mapping as target:

    One one = new One();
    one.setA(1);
    one.setB(2);

    Two two = new Two();
    two.setC("3");

    Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();

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

    mapper.map(two, destination);

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

This even works with an empty mapping configuration file.

Upvotes: 15

Perception
Perception

Reputation: 80593

Not directly no. You would need to either create a new class to wrap around your two source classes and copy from that:

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>

Or you would need to copy twice, once from each source class to the destination object, making sure not to blank out existing fields.

<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>

Upvotes: 4

Related Questions