/ / alternativa a @XmlSeeAlso - java, jaxb

alternativa a @XmlSeeAlso - java, jaxb

abstract Class A{

}


Class B extends A{

}


@XmlRootElement
Class C {
@XmlElement(name = "tobeserialized")
A tobeserialized;
}


Class D{
public void marshal(){
C all = getData();
JAXB.marshal(all, new File("saved.xml");

}

}

per JAXB sapere che la classe B è una sottoclasse di classe A, dovrei mettere un @XmlSeeAlso (value = {B.class}) sulla classe A. Abbiamo circa 50 sottoclassi di A.

Ma la dipendenza del progetto è tale che la Classe A si trova in un pacchetto che non può accedere alla Classe B. Quindi non posso inserire l'annotazione sulla Classe A.

quali possono essere le alternative da guardare, in modo che JAXB possa serializzare le sottoclassi di Classe A?

risposte:

3 per risposta № 1

Il @XmlSeeAlso l'annotazione non è necessaria per mappare una relazione di ereditarietà, ma è quella in cui viene usata più spesso @XmlSeeAlso è dire a JAXB di inserire e produrre metadati per le classi che non possono essere dedotte dal percorrere la classe.

Nel tuo esempio se hai creato il JAXBContext solo su C classe (JAXBContext.newInstance(C.class)) poi il A la classe verrebbe anche elaborata a causa di tobeserialized campo, ma B non sarebbe perché non esiste un meccanismo in Java per trovare sottoclassi. Potresti risolvere questo problema mettendo @XmlSeeAlso(B.class) sopra A o includendo le sottoclassi nelle classi utilizzate per eseguire il boot di JAXBContext:

JAXBContext.newInstance(B.class, C.class);

0 per risposta № 2

È passato molto tempo da me, ma potresti provare ad aggiungere @XmlTransient in classe A e @XmlType sulla classe B.

O @XmlTransient sulle classi A e B (poiché sono astratte) e aggiungono @XmlType alle sottoclassi concrete.