在Dozer中使用抽象类型成员映射类时的InstantiationException

时间:2014-01-27 10:09:15

标签: java dozer

我是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 ] - 添加了完整的类声明。

2 个答案:

答案 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;
    }
}