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.
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>
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;
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.