NAMESPACE_ERR:尝试以对名称空间不正确的方式创建或更改对象

时间:2010-10-27 19:53:51

标签: java xml webservice-client xalan saaj

尝试从SOAP响应中检索SOAP正文,但收到此错误:

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

使用Saaj1.4

对此有什么解决方法?

6 个答案:

答案 0 :(得分:11)

我遇到了同样的问题。在我的情况下,修复服务器端的问题不是一个选项。我在客户端修复它,强制Xalan到2.7.0版本。请参阅this

答案 1 :(得分:9)

我和Flying Saucer有类似的问题。 根据jddsantaella的建议,我查看了我的POM依赖项。我使用的项目使用Struts,而struts下的项目依赖于Xalan 2.5.1。

我在struts依赖部分的POM中添加了以下内容:

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

飞碟现在是一种享受。

希望这有帮助。

答案 2 :(得分:8)

我自己有这个确切的问题并且因为错误信息的含糊不清而浪费了半天的时间来修复它。问题出在您的SOAP服务上(而不是客户端实现)。它正在抛出一个错误,因为您发送给客户端的XML存在名称空间问题。

根据this article,问题可能有三个原因:

  1. 空名称空间前缀
  2. “xml”的名称空间前缀不在“http://www.w3.org/XML/1998/namespace”的namespaceURI中
  3. “xmlns”的名称空间前缀不在“http://www.w3.org/2000/xmlns/”的namespaceURI中
  4. 在我的情况下,上面的#1导致了问题。我没有使用命名空间返回XML。我通过向根元素添加命名空间(“ns”变量)和所有子节点来修复它:

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

    请务必注意,我的示例代码适用于JDom,而不是Dom4j。您必须使用适合您正在使用的XML库的代码。

答案 3 :(得分:8)

使用 spring-ws

我遇到了同样的问题

通过添加其他第三方库,xalan-2.6.0.jar已添加到我的war文件中。这导致了相同的NAMESPACE_ERR

我通过添加xalan-2.7.0.jar代替suggested by spring解决了错误。

答案 4 :(得分:5)

我通过让DocumentBuilderFactory名称空间知道来解决这个问题:

DocumentBuilderFactory.setNamespaceAware(true)

答案 5 :(得分:0)

我遇到了Java 8和WebLogic 12c的问题。

就我而言,它有助于添加到WAR org.glassfish.jaxb:jaxb-runtime:2.3.3

棘手的是,应用程序在很长时间内都没有依赖项。但是某个特定请求中的某些内容导致了此错误,但我仍然不确定这是什么。但是,新的依赖关系有所帮助。