【问题标题】:InstantiationException when Mapping a Class with Abstract Type Member in Dozer在 Dozer 中映射具有抽象类型成员的类时发生 InstantiationException
【发布时间】:2014-01-27 10:09:15
【问题描述】:

我是推土机新手,我正在尝试为 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->A 时,我得到了 InstantiationException。 我怀疑推土机正在尝试实例化抽象类classC。有什么属性可以告诉推土机使用 ClassD?请帮忙。

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

【问题讨论】:

  • 您的课程中有 Getter/Setter 吗?另外,你能提供错误的堆栈跟踪吗?
  • 嗨,是的,我有 getter/setter。这是堆栈跟踪的链接pastebin.com/MJ7MMTx0
  • 你能提供课程的代码吗?堆栈跟踪提示目的地存在问题。
  • 我添加了完整的类定义

标签: java dozer


【解决方案1】:

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

"classC 是一个抽象类,ClassD 是一个具体类。当我映射 A->B 时没有问题,但是当我映射 B->A 时,我得到了 InstantiationException。我怀疑推土机正在尝试实例化抽象类classC。”

这有点像在黑暗中拍摄,但我会尝试,阅读推土机支持页面和这个问题:How to map a field with type as an abstract class with dozer?。我可能不是 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>

【讨论】:

  • 嗨,我已经尝试过了,但它不起作用。如果我是正确的 c.x 是一个字符串,那么提示将不起作用。请看我的回答。
  • 好吧,别担心,伙计。感谢您提供解决方案,下次会努力记住这个!
【解决方案2】:

好的,知道了。你需要使用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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多