JAXB et les classes abstraites
Je suis en train d'utiliser JAXB pour unmarshall du XML, mais j'obtiens un "Impossible de créer une instance de..." l'exception". Je comprends pourquoi, c'est d'essayer de créer une instance d'une classe abstraite. Ce que je veux, c'est de faire une instance d'une application spécifique de la classe. Mon but est d'avoir de la classe des contrôles spécifiques sur les méthodes de définition. Peut-être "qux" est valide baz valeur pour BarImpl, mais BarImpl2 veut faire quelque chose d'autre.
J'ai obtenu le cadre de la sorte, il n'y en a pas en annotant Foo, mais si je unannotate bar, les choses se corsent.
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.junit.Test;
public class JAXBTest {
@Test
public void test() throws javax.xml.bind.JAXBException {
String xml =
"<foo>" +
" <bar>" +
" <baz>qux</baz>" +
" </bar>" +
"</foo>";
javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
FooImpl.class,
BarImpl.class
);
javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.unmarshal(new java.io.StringReader(xml));
}
@XmlRootElement(name="foo")
public static abstract class Foo {
@XmlElement(name="bar")
Bar bar;
}
@XmlRootElement(name="bar")
public static abstract class Bar {
@XmlElement(name="baz")
String baz;
}
public static class FooImpl extends Foo { }
public static class BarImpl extends Bar { }
}
OriginalL'auteur David Ehrmann | 2012-03-06
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer les opérations suivantes:
@XmlRootElement
au lieu de les classes abstraites.@XmlTransient
(voir http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)@XmlElement(type=BarImpl.class)
sur lebar
propriété pour spécifier le type de béton (voir http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html).JAXBTest
J'ai mis à jour ma réponse à utiliser
@XmlElements
pour gérer ce cas d'utilisation.Il a travaillé! Le seul ennui c'est que le réalisateur de BarImpl2 besoin de changer les annotations Foo, mais c'est seulement une gêne.
Et si il y a une méthode abstraite, sans déclaration de variable derrière elle? Dire une barre de lecture, mais il n'y a pas de barre de la déclaration de la variable, puis-je encore utiliser @XmlElements... sur la méthode elle-même pour obtenir le même comportement?
Cher, j'ai essayé ton code mais XmlTransient va dans l'erreur: "Le XmlTransient est désactivée pour cet emplacement". J'ai ajouté public statique de la classe abstraite DataGridData annoté avec XmlTransient dans ma classe DataGrid. Où est ma faute?
OriginalL'auteur Blaise Doughan