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の使用
これに対する修正は何でしょうか?
私も同じ問題に直面しました。私の場合、サーバー側の問題を修正することはできませんでした。 Xalanをバージョン2.7.0に強制するクライアント側で修正しました。 this を参照してください。
フライングソーサーにも同様の問題がありました。 jddsantaellaのアドバイスに従って、POMの依存関係を調べました。私が使用していたプロジェクトは使用済みのStrutsで、そのカバーの下でStrutsはXalan 2.5.1に依存していました。
Struts依存関係セクションのPOMに以下を追加しました。
<exclusions>
<exclusion>
<artifactId>xalan</artifactId>
<groupId>xalan</groupId>
</exclusion>
</exclusions>
Flying Saucerがおやつになりました。
お役に立てれば。
私はこの正確な問題を自分で抱えていて、エラーメッセージがいかにあいまいであるため、修正に半日ほど無駄に費やしました。問題はあなたのSOAP=サービス(クライアントの実装ではない)にあります。クライアントに送信するXMLに名前空間の問題があるため、エラーをスローします。
この記事 に従って問題の3つの考えられる理由があります:
私の場合、問題を引き起こしたのは上記の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ライブラリに適したコードを使用する必要があります。
spring-wsを使用して同じ問題が発生しました
別のサードパーティライブラリを追加することで、xalan-2.6.0.jar
がwarファイルに追加されました。これは同じNAMESPACE_ERR
を引き起こしました
代わりにxalan-2.7.0.jar
を springで推奨 として追加して、エラーを解決しました。
DocumentBuilderFactory名前空間を認識するようにすることでこれを解決しました:
DocumentBuilderFactory.setNamespaceAware(true)