10 votes

Utilisation de Jaxb2Marshaller avec plusieurs classes ayant le même nom @XmlRootElement

Je travaille sur un service web utilisant spring-mvc et Jaxb2Marshaller.

J'ai deux classes, toutes deux annotées avec le même @XmlRootElement nom

@XmlRootElement(name="request")
class Foo extends AstractRequest {

}

@XmlRootElement(name="request")
class Bar extends AbstractRequest {

}

Les trois classes (AbstractRequest, Foo, Bar) sont incluses dans la liste des classesToBeBound dans le même ordre

Maintenant la demande qui utilise Bar fonctionne bien. Mais celle qui utilise Foo lève une exception ClassCastException pendant le démarchage avec le message suivant Bar cannot be cast to Foo

Le code du contrôleur est le suivant,

Source source = new StreamSource(new StringReader(body));
Foo request = (Foo) this.jaxb2Marshaller.unmarshal(source); 

Je suppose cela se produit parce que Bar a en quelque sorte priorité sur Foo puisqu'il est écrit après Foo dans la liste des classes à lier dans le fichier spring-servlet.xml.

Cependant, j'ai également de multiples classes annotées avec @XmlRootElement(name="response") et la mise en commun de la réponse ne pose aucun problème.

Existe-t-il un moyen de spécifier la classe à utiliser par le jaxb2Marshaller pour le démarchage ?

4voto

Jtsay Points 41

Vous pouvez passer la classe à Jaxb2Marshaller avant la dé-marshalation :

Source source = new StreamSource(new StringReader(body));
jaxb2Marshaller.setMappedClass(Foo.class);

Foo request = (Foo) jaxb2Marshaller.unmarshal(source);

3voto

Blaise Doughan Points 75613

Vous pouvez créer un Unmarshaller à partir de Jaxb2Marshaller, puis vous pouvez passer la classe que vous voulez démarshaller comme paramètre à la méthode unmarshal qui prend une Source :

Source source = new StreamSource(new StringReader(body));
Unmarshaller unmarshaller = jaxb2Marshaller.createUnmarshaller();
Foo request = (Foo) unmarshaller.unmarshal(source, Foo.class).getValue(); 

Pour plus d'informations, voir :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X