Java 在Dozer中映射具有抽象类型成员的类时发生实例化异常

Java 在Dozer中映射具有抽象类型成员的类时发生实例化异常,java,dozer,Java,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 get

我是推土机新手,我正在尝试为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>

甲级
B类
c、 x
x
classC是一个抽象类,ClassD是一个具体类。当我映射A->B时没有问题,但是当我映射B->A时,我得到了实例化异常。 我怀疑推土机试图实例化抽象类classC。有任何属性告诉推土机使用ClassD吗?请帮忙


[EDIT1]-添加了完整的类声明。

您添加的这条评论是正确的

“classC是一个抽象类,ClassD是一个具体类。当我映射a->B时没有问题,但是当我映射B->a时,我得到了实例化异常。我怀疑推土机试图实例化抽象类classC。”

这有点像是瞎猜,但在阅读了推土机支持页面和以下问题后,我会尝试一下:。我可能不是100%正确,但我很确定这需要符合这些原则

<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>

甲级
B类
c、 x
x
D类

好的,明白了。您需要使用create方法

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

甲级
B类
c、 x
x
公共类工厂{
公共静态类A createClassA(){
ClassA ClassA=新的ClassA();
setC(新的ClassD());
返回A类;
}
}

您的类中有getter/setter吗?另外,你能提供错误的堆栈跟踪吗?嗨,是的,我有getter/setter。这是stacktrace的链接。你能提供类的代码吗?stacktrace提示目标有问题。我添加了完整的类定义。我已经尝试过了,但它不起作用。如果我是正确的,c.x是一个字符串,所以提示将不起作用。请看我的答案。好的,不用担心。感谢您提供的解决方案,我们将努力记住这一点,以备下次使用!