Search code examples
javadozer

InstantiationException when Mapping a Class with Abstract Type Member in Dozer


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.


Solution

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