我是dozer的新手,我正在尝试为ClassA和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 {
}
我尝试了下面的映射
<mapping>
<class-a>ClassA</class-a>
<class-b>ClassB</class-b>
<field>
<a>c.x</a>
<b>x</b>
</field>
<mapping>
classC是一个抽象类,ClassD是具体的。当我映射A-> B时没有问题但是当我映射B-&gt; A时,我得到InstantiationException。 我怀疑推土机试图实例化抽象类classC。告诉推土机使用ClassD的任何属性?请帮忙。
[ EDIT1 ] - 添加了完整的类声明。
答案 0 :(得分:1)
您添加的评论是正确的。
&#34; classC是一个抽象类,ClassD是具体的。当我映射A-> B时没有问题但是当我映射B-&gt; A时,我得到了InstantiationException。我怀疑推土机试图实例化抽象类classC。&#34;
这是一个黑暗中的镜头,但我会尝试,阅读推土机支持页面和这个问题:How to map a field with type as an abstract class with dozer?。我可能不是百分之百正确,但我很确定它需要成为这样的东西。
<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>
答案 1 :(得分:0)
好的,明白了。您需要使用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;
}
}