2010-08-24 6 views
0

Comment est-ce que je peux démarshaler un message qui a été rassemblé en utilisant une partie locale QName différente de ce qui est attendu?JAXB: Unmarsal un message utilisant QName?

Mon exemple est ci-dessous:

Étant donné un objet à unmarshal qui a été créée en utilisant une méthode de maréchal, comme

 marshaller.marshal(new JAXBElement(
         new QName("urn:somenamespace","DifferentNameMessage"), 
         OriginalMessageType.class, 
         originalMsg), 
        result); 

(Si je comprends bien ce bout de code, le QName INDIQUE pour faire la l'élément racine utilise une balise de nom de substitution autre que celle spécifiée dans le schéma d'origine Essentiellement en utilisant une méthode de nom de substitution Par exemple, dans le QName au-dessus de la balise originale aurait été "NameMessage" mais le message a été rassemblé en utilisant la partie locale "DifferentNameMessage".)

J'utilise habituellement une méthode de unmarshalling tels que:

 String xmlString = convertStreamToString(in); 
    final StringReader xmlReader = new StringReader(xmlString); 
    final StreamSource xmlSource = new StreamSource(xmlReader);   

    JAXBContext jaxbContext = JAXBContext.newInstance(OriginalMessageType.class); 
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
    JAXBElement ret = null; 
    ret = unmarshaller.unmarshal(xmlSource, OriginalMessageType.class); 

Mais, si j'utilise cette méthode alors le nom JAXBElement ret est pour le QName qui a été utilisé pour marshalé, et pourtant le DeclaredType est pour OriginalMessageType.class et le message unmarshalled contiennent des valeurs d'élément null pour les sous-éléments attendus, même si le message d'origine contient des valeurs valides pour ces sous-éléments.

Je me demande s'il est possible de spécifier le nom de remplacement QName pendant unmarshalling pour indiquer qu'il est un substitut et ensuite d'utiliser l'étiquette d'origine à sa place?

Répondre

1

Ce qui suit est correcte:

ret = unmarshaller.unmarshal(xmlSource, OriginalMessageType.class); 

Est-ce que vous faites votre JAXBContext lorsque votre marshalé?

JAXBContext jaxbContext = JAXBContext.newInstance(OriginalMessageType.class); 

choses à essayer:

  1. Avez-vous vérifié le document est correct marshalé? Que se passe-t-il lorsque vous utilisez le même JAXBContext pour marshal et unmarshal?
+0

1. J'ai utilisé un contexte JAXBC différent pour marshal et unmarshal. 2. Je n'ai pas vérifié, je le ferai maintenant. 3. Je vais revenir en arrière et tester marshall/unmarshall avec le même JAXBContext –

+0

Cela a résolu le problème. J'utilisais JAXBContext incorrect! Merci beaucoup. –

Questions connexes