2010-07-20 16 views
5

Nunca antes había usado JAXB. Estoy trabajando en un proyecto de prueba de arneses. Tengo alrededor de 20 testcases diferentes. Cuando realizo mi prueba, obtengo este error.3 cuentas de Ilegal Anotación Excepciones

Mi estructura es como:

A es la clase TestCase base.

B extiende A.

C extiende B.

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

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

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

y para unmarshalling mis archivos XML que escribí

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

mi archivo XML se parece a:

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

cuando ejecuto mi código consigo 3 cargos de IllegalAnnotationException.

Respuesta

12

Los IllegalAnnotationExceptions se deben a que no tienen por defecto constructores cero-arg en A, B, y C.

Añadir a una:

public A() { 
} 

Añadir a B:

public B() { 
} 

Y agrégalo a C:

public C() { 
} 
+0

¿Por qué agregar un ze ro args constructor? – om39a

+0

Por lo que yo entiendo, el constructor por defecto de cero arg es necesario porque la manera en que la serilización/deserialización funciona es que la primera instancia se crea usando el constructor predeterminado y luego los valores se inyectan utilizando la reflexión. Entonces necesitas un constructor predeterminado. –

Cuestiones relacionadas