2010-07-20 5 views
5

Ich habe noch nie zuvor JAXB verwendet. Ich arbeite an einem Testgeschirrprojekt. Ich habe ungefähr 20 verschiedene Testfälle. Wenn ich meinen Test ausführe, erhalte ich diesen Fehler.3 Zählungen von IllegalAnnotationExceptions

Meine Struktur ist wie:

A die Klasse Basis Testcase ist.

B erweitert A.

C erweitert B.

Basisklasse A:

public class A { 
    public A(String t){ 
    testName = t; 
    } 

    private String aData; 
    private String testName; 
    public void setAData(String a){ 
    aData = a; 
    } 

    public void getAData(){ 
    return aData; 
    } 

    public void setTestName(String t){ 
    testName = t; 
    } 

    public void getTestName(){ 
    return testName; 
    } 
} 

Klasse B:

public class B extends A{ 
    public B(String testName){ 
     super(testName); 
    } 

    private String bData; 
    public void setBData(String b){ 
     bData = b.trim(); 
    } 
    public String getData(){ 
     return bData; 
    }  
} 

Klasse C:

@XmlRootElement(name="C") 
public class C extends B{ 
    public C(String testName){ 
     super(testName); 
    } 

    private String cData; 
    public void setCData(String c){ 
     cData = c; 
    } 
    public String getCData(){ 
     return cData; 
    } 
} 

und für unmarshalling meine XML-Dateien i schrieb

public C unmarshall(C test, String dir){ 
    try { 
     JAXBContext jc = JAXBContext.newInstance(c.getClass); 
     Unmarshaller u = jc.createUnmarshaller(); 

     test = (C)u.unmarshal(new FileInputStream(dir)); 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 

    return test; 
} 

meine XML-Datei wie folgt aussieht:

<C> 
    <aData> aaaa </aData> 
    <bData> bbbb </bData> 
    <cData> cccc </cData> 
</C> 

, wenn ich meinen Code ausführen i 3 zählt von IllegalAnnotationException erhalten.

Antwort

12

Die IllegalAnnotationExceptions sind aufgrund nicht standardmäßig Null-arg Konstrukteuren auf A, B und C.

In den A mit:

public A() { 
} 

In den B:

public B() { 
} 

Und zu C hinzufügen:

public C() { 
} 
+0

Warum ein ze hinzufügen Ro-Args-Konstruktor? – om39a

+0

So weit ich verstehe, wird der Standardkonstruktor null arg benötigt, da die Art und Weise, wie Serilisierung/Deserialisierung funktioniert, die erste Instanz mit dem Standardkonstruktor erstellt wird und dann die Werte mittels Reflektion injiziert werden. Sie benötigen also einen Standardkonstruktor. –