Reputation: 6855
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
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
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