2010-10-27 32 views
14

tente de récupérer le corps SOAP d'une réponse SOAP, mais obtenir cette erreur:NAMESPACE_ERR: Une tentative de créer ou modifier un objet d'une manière qui est incorrecte en ce qui concerne les espaces de noms

NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. 

Document doc = soapResMsg.getSOAPBody().extractContentAsDocument(); -- Exception is thrown here 
org.dom4j.io.DOMReader d4Reader = new org.dom4j.io.DOMReader(); 
org.dom4j.Document d4doc = d4Reader.read(doc); 

En utilisant Saaj1 .4

Que serait une solution pour cela?

Répondre

6

J'ai eu ce problème exact moi-même et j'ai gaspillé une bonne demi-journée à le réparer à cause du vague message d'erreur. Le problème est avec votre service SOAP (PAS l'implémentation du client). Il génère une erreur car il existe un problème d'espace de nom avec le fichier XML que vous envoyez au client.

Il y a trois raisons possibles pour la question selon this article:

  1. Un namespace prefix null
  2. Un préfixe d'espace de noms "xml" qui ne sont pas dans le namespaceURI de « http: // www. w3.org/XML/1998/namespace »
  3. Un préfixe d'espace de noms de "xmlns" qui ne sont pas dans le namespaceURI de "http://www.w3.org/2000/xmlns/"

en mon cas c'était # 1 ci-dessus que cau sed le problème. Je ne renvoyais pas le XML avec un espace de noms. Je l'ai fixé en ajoutant un espace de noms (la « ns » variable) à l'élément racine et tous les nœuds enfants comme ceci:

Namespace ns = Namespace.getNamespace("tns", "http://mycompany.com/schemas"); 

    Element result = new Element("ResponseType", ns); 
    Document doc = new Document(result); 

    result.addContent(new Element("StatusCode", ns).setText(code)); 
    result.addContent(new Element("Message", ns).setText(message)); 

Il est important de noter que mon code exemple pour JDom, pas Dom4j que la personne était demander. Vous devrez utiliser le code approprié pour la bibliothèque XML que vous utilisez.

10

J'ai rencontré le même problème. Dans mon cas, résoudre le problème sur le côté serveur n'était pas une option. Je l'ai corrigé du côté client, forçant Xalan à la version 2.7.0. Voir this.

9

J'ai eu un problème similaire avec Flying Saucer. En suivant les conseils de jddsantaella, j'ai regardé mes dépendances POM. Le projet que j'utilisais utilisait des Struts et sous les entretoises de couverture avait une dépendance sur Xalan 2.5.1.

j'ajouté ce qui suit au POM dans la section de dépendance des entretoises:

<exclusions> 
<exclusion> 
    <artifactId>xalan</artifactId> 
     <groupId>xalan</groupId> 
</exclusion> 
</exclusions> 

soucoupe volante fonctionne maintenant un régal.

Espérons que cela aide.

6

J'ai eu le même problème en utilisant ressort ws

En ajoutant une autre bibliothèque tierce partie, xalan-2.6.0.jar a été ajouté à mon dossier de guerre. Cela a causé le même NAMESPACE_ERR

J'ai résolu l'erreur en ajoutant xalan-2.7.0.jar à la place, comme suggested by spring.

+0

Que dois-je faire si je suis obligé d'utiliser xalan-2.6.0 par une autre dépendance? – Everv0id

2

Je résolu ce problème en faisant l'espace de noms DocumentBuilderFactory conscient:

DocumentBuilderFactory.setNamespaceAware(true)