2013-09-03 2 views
2

Je travaille actuellement sur les messages XML/unmarshalling triages. Voici mes deux éléments XML:JAXB Utiliser l'espace de noms par défaut

@XmlRootElement(namespace = "http://namespaceA") 
public class RootElementA { 

    @XmlElement 
    private ElementXX elementXX; 

} 

@XmlRootElement(namespace = "http://namespaceB") 
public class RootElementB { 

    @XmlElement 
    private ElementXX elementXX; 

} 

Quand unmarshalling un RootElementB je l'erreur suivante:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://namespaceB", local:"ElementXX"). Expected elements are <{}ElementXX> 

Si j'ajoute l'espace de noms à la déclaration ElementXX, j'ai la même erreur, sauf qu'il se produit pour les propriétés de ElementXX.

Le problème est que je ne peux pas définir l'espace de noms sur les propriétés de ElementXX parce qu'il est spécifié dans les deux espaces de noms et je ne veux pas dupliquer ma classe juste pour changer l'espace de noms ...

-vous j'ai une idée ? Merci.

EDIT

Voici un exemple XML:

<RootElementA xmlns="http://namespaceA"> 
    <ElementXX> 
     <name>blabla</name> 
     <desc>blabla</desc> 
    </ElementXX> 
</RootElementA> 

Si je ne mets pas un espace de noms ElementXX en classe XmlRootElementA je l'erreur ci-dessus. Si je l'ai défini, j'ai la même erreur mais pour la propriété de nom.

Répondre

0

vous na pas avoir xml ici pour regarder .. mais je suppose que le lien ci-dessous vous donnera une réponse.

XML unmarshalling using Jaxb with namespaces and schema

sinon afficher le code XML que vous essayez de unmarshall.

+0

Je mis à jour ma question avec le XML. Le XML provient d'une API externe, donc je ne peux pas l'éditer avant unmarshalling (je n'ai pas trouvé de réponse dans votre lien). – c4k

1

Vous pouvez supprimer l'annotation @XmlElement pour ElementXX. Tant qu'il a un getter public, le comportement par défaut est aussi de le marauder.

Le XML devrait alors ressembler à ceci.

<ns3:rootElementB xmlns:ns2="http://namespaceA" xmlns:ns3="http://namespaceB"> 
    <elementXX/> 
</ns3:rootElementB> 

Une alternative est de déclarer l'espace de noms ElementXX dans sa classe java en utilisant @XmlRootElement similaire à RootElementA et B. Ensuite, le remplacement @XmlElement avec @XmlElementRef dans RootElementA et B.

XML alors ressembler à ceci: (Remarque: J'ai ajouté le nom du champ pour le test)

<ns4:rootElementB xmlns:ns2="http://namespaceXX" xmlns:ns3="http://namespaceA" xmlns:ns4="http://namespaceB"> 
    <ns2:elementXX> 
     <name>test</name> 
    </ns2:elementXX> 
</ns4:rootElementB> 

Je n'ai pas pu reproduire exactement votre erreur. Je pense, cependant, qu'avoir ElementXX déclaré dans deux namespaces n'est pas conseillé, c'est le moins qu'on puisse dire. Si vous pouvez modifier vos schémas, je suggère de créer un nouveau avec son propre espace de noms et de déclarer ElementXX dedans. Puis modifiez les deux autres pour référencer ses éléments.

+0

"Je pense, cependant, qu'avoir ElementXX déclaré dans deux namespaces n'est pas conseillé": tout à fait d'accord avec vous mais j'utilise des schémas pour une API externe, je ne peux pas les modifier. En fait je voudrais utiliser ElementXX de namespace A dans RootElementA et ElementXX de namespace B dans RootElementB, sans avoir à spécifier l'espace de noms dans la déclaration. Est-ce possible ? – c4k

0

Vous pouvez utiliser l'annotation @XmlSchema pour spécifier la qualification d'espace de noms pour les classes et les propriétés dans un package. Vous pouvez spécifier l'espace de noms pour les propriétés d'une classe en spécifiant l'espace de noms sur @XmlType. Ensuite, vous pouvez spécifier l'espace de noms pour un élément si simple/attribut à l'aide @XmlRootElement, @XmlElement et @XmlAttribute.

Pour plus d'informations

+0

Merci pour le lien, très utile mais pas pour mon problème ici;) Le problème principal est que si je place namespaceB à ElementXX dans RootElementB, j'ai l'erreur ci-dessus pour les éléments dans ElementXX ... Et je ne peux pas définir namespace dans ElementXX comme ma classe est le mappage d'un élément XML présent dans namespaceA et namespaceB ... Je voudrais préciser que lors de l'ajout d'ElementXX dans RootElementA, utilisez namespaceA, et lors de l'ajout dans RootElementB, utilisez namespaceB – c4k

+0

@Chafik - Il y en a 2 propriétés distinctes 'elementXX' qui sont gérées en utilisant l'un des mécanismes que j'ai indiqué. Le vrai problème ici est comment gérer l'instance de 'ElementXX' correct? –

+0

Exactement. Je ne veux pas gérer deux classes ElementXX qui sont exactement les mêmes, sauf l'espace de noms – c4k

Questions connexes