2010-10-27 29 views
14

Der Versuch, den SOAP-Körper aus einer SOAP-Antwort abzurufen, aber diesen Fehler:NAMESPACE_ERR: Es wird versucht, zu erstellen oder ein Objekt in einer Weise zu ändern, die im Hinblick auf die Namensräume nicht richtig ist

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); 

Mit Saaj1 .4

Was wäre eine Lösung dafür?

Antwort

6

Ich hatte dieses genaue Problem selbst und verschwendete einen guten halben Tag damit, es zu reparieren, weil wie vage die Fehlermeldung ist. Das Problem liegt bei Ihrem SOAP-Dienst (NICHT bei der Client-Implementierung). Es wird ein Fehler ausgegeben, da ein Namespace-Problem mit der XML-Datei besteht, die Sie an den Client senden.

Es gibt drei mögliche Gründe für die Ausgabe nach this article:

  1. Ein Null Namespacepräfix
  2. Ein Namespacepräfix „xml“, die nicht in der namespaceURI von „http: // www. w3.org/XML/1998/namespace“
  3. ein Namespacepräfix von "xmlns http://www.w3.org/2000/xmlns/", die nicht in dem von namespaceURI ist ""

in mein Fall war es # 1 oben, dass cau sed das Problem. Ich habe das XML nicht mit einem Namespace zurückgegeben. Ich reparierte sie durch einen Namensraum hinzugefügt (der „ns“ Variable) mit dem Wurzelelement und alle untergeordneten Knoten wie folgt:

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)); 

Es ist wichtig, dass mein Beispiel-Code für JDom ist, nicht Dom4j als die Person zu beachten war fragend. Sie müssen den Code verwenden, der für die XML-Bibliothek, die Sie gerade verwenden, geeignet ist.

10

Ich hatte das gleiche Problem. In meinem Fall, beheben Sie das Problem auf der Serverseite war keine Option. Ich habe es auf der Client-Seite behoben, indem ich Xalan auf Version 2.7.0 gezwungen habe. Siehe this.

9

Ich hatte ein ähnliches Problem mit Fliegenden Untertasse. Dem Rat von jddsantaella folgend, habe ich meine POM-Abhängigkeiten durchgesehen. Das Projekt, das ich benutzte, verwendete Struts und unter der Decke war eine Abhängigkeit von Xalan 2.5.1.

Ich habe folgendes auf die POM im Abschnitt Streben Abhängigkeit:

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

Flying Saucer arbeitet jetzt ein Genuss.

Hoffe, das hilft.

6

I

durch eine andere Dritte Bibliothek hinzugefügt wurde xalan-2.6.0.jar meine WAR-Datei hinzugefügt, um das gleiche Problem mit feder ws hatte. Dies verursachte das gleiche NAMESPACE_ERR

Ich löste den Fehler durch Hinzufügen xalan-2.7.0.jar statt, wie suggested by spring.

+0

Was muss ich tun, wenn ich durch eine andere Abhängigkeit xalan-2.6.0 zu verwenden gezwungen bin? – Everv0id

2

Ich löste dies durch die Documentnamespace bewusst machen:

DocumentBuilderFactory.setNamespaceAware(true)