Reputation: 1227
I'm new to dozer and I'm trying to create a map for ClassA and ClassB
public class ClassA {
ClassC c;
public ClassC getC() {
return c;
}
public void setC(ClassC c) {
this.c = c;
}
}
public class ClassB {
private String x;
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
}
public abstract class ClassC {
private String x;
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
}
public class ClassD extends ClassC {
}
I tried the mapping below
<mapping>
<class-a>ClassA</class-a>
<class-b>ClassB</class-b>
<field>
<a>c.x</a>
<b>x</b>
</field>
<mapping>
classC is an abstract class and ClassD is a concrete. When I map A->B there is no problem but when I map B->A, I'm getting InstantiationException. I suspect that the dozer is trying to instantiate abstract class classC. Any attribute to tell dozer to use ClassD? Please help.
[EDIT1] - Added the full class declaration.
Upvotes: 3
Views: 2490
Reputation: 1227
Ok got it. You need to use create-method
<mapping>
<class-a create-method="ClassAFactory.createClassA">ClassA</class-a>
<class-b>ClassB</class-b>
<field>
<a>c.x</a>
<b>x</b>
</field>
<mapping>
public class ClassAFactory {
public static ClassA createClassA(){
ClassA classA = new ClassA();
classA.setC(new ClassD());
return classA;
}
}
Upvotes: 0
Reputation: 1887
This comment you've added is right on the money.
"classC is an abstract class and ClassD is a concrete. When I map A->B there is no problem but when I map B->A, I'm getting InstantiationException. I suspect that the dozer is trying to instantiate abstract class classC."
This is a bit of a shot in the dark, but what i would try, having read the dozer support pages and this question: How to map a field with type as an abstract class with dozer? . I might not be 100% right, but i'm pretty sure it's going to need to be something along these lines.
<mapping>
<class-a>ClassA</class-a>
<class-b>ClassB</class-b>
<field>
<a>c.x</a>
<b>x</b>
<a-hint>ClassD</a-hint>
</field>
<mapping>
Upvotes: 1