21

尝试从 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

有什么办法可以解决这个问题?

4

6 回答 6

15

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

DocumentBuilderFactory.setNamespaceAware(true)
于 2017-01-08T22:59:00.930 回答
12

我遇到了同样的问题。就我而言,解决服务器端的问题不是一种选择。我在客户端将它修复,强制 Xalan 到 2.7.0 版。看到这个

于 2012-01-27T16:56:42.570 回答
11

我自己也遇到了这个确切的问题,并且由于错误消息的含糊程度而浪费了半天的时间来修复它。问题在于您的 SOAP 服务(不是客户端实现)。它会引发错误,因为您发送给客户端的 XML 存在名称空间问题。

根据这篇文章,这个问题有三个可能的原因:

  1. 空命名空间前缀
  2. “xml”的命名空间前缀不在“http://www.w3.org/XML/1998/namespace”的命名空间URI中
  3. 不在“http://www.w3.org/2000/xmlns/”的命名空间URI中的“xmlns”命名空间前缀

就我而言,是上面的#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 库的代码。

于 2010-11-04T14:49:38.077 回答
10

我对飞碟也有类似的问题。按照 jddsantaella 的建议,我查看了我的 POM 依赖项。我使用的项目使用了 Struts,并且在幕后 struts 依赖于 Xalan 2.5.1。

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

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

飞碟现在是一种享受。

希望这可以帮助。

于 2012-06-15T12:30:02.420 回答
9

我在使用spring-ws时遇到了同样的问题

通过添加另一个第三方库,xalan-2.6.0.jar被添加到我的战争文件中。这导致了同样的NAMESPACE_ERR

正如springxalan-2.7.0.jar所建议的那样,我通过添加来解决了错误。

于 2012-07-12T14:33:03.240 回答
0

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

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

棘手的是,应用程序在没有依赖关系的情况下工作了很长时间。但是一个特定请求中的某些东西导致了这个错误,我仍然不确定它是什么。但是,新的依赖项有所帮助。

于 2020-11-20T06:20:12.487 回答