2010-07-20 2 views
5

Je n'ai jamais utilisé JAXB auparavant. Je travaille sur un projet de harnais de test. J'ai environ 20 testcases différents. Quand je lance mon test, j'obtiens cette erreur.3 chefs d'IllegalAnnotationExceptions

Ma structure est comme:

A est la classe de base TestCase.

B s'étend A.

C s'étend B.

classe de base 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; 
    } 
} 

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

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

et pour unmarshalling mes fichiers xml j'ai écrit

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

mon fichier xml ressemble:

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

quand je lance mon code que je reçois 3 chefs d'accusation de IllegalAnnotationException.

Répondre

12

Les IllegalAnnotationExceptions sont dues à vous de ne pas avoir constructeurs zéro arg par défaut sur A, B et C.

Ajouter à A:

public A() { 
} 

Ajouter à B:

public B() { 
} 

Et ajouter à C:

public C() { 
} 
+0

Pourquoi ajouter un ze ro args constructeur? – om39a

+0

Autant que je comprenne zéro constructeur par défaut d'arg est nécessaire parce que la manière dont la sérilisation/désérialisation fonctionne est la première instance est créée en utilisant le constructeur par défaut, puis les valeurs sont injectées en utilisant la réflexion. Vous avez donc besoin d'un constructeur par défaut. –

Questions connexes