2

コンソールから動作するWSSインターセプターを備えたCXFWebサービスクライアントがありますが、JBossから実行すると次のような例外がスローされます。

予期しない例外が発生しました

Unexpected exception occured 
javax.xml.ws.soap.SOAPFaultException: WRONG_DOCUMENT_ERR: A node is
used in a different document
than the one that created
it.    
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)   
at $Proxy1020.getAccountStatements(Unknown Source)  
at com.sru.statement.impl.cs.CSStatementGetter.getStatementFromBank(CSStatementGetter.java:164)   
at com.sru.statement.impl.cs.CSStatementGetter.getStatement(CSStatementGetter.java:90)   
at com.sru.hub.common.statement.CommonStatementImportExecutor.execute(CommonStatementImportExecutor.java:89)   
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)   
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)   
at java.lang.reflect.Method.invoke(Method.java:597)   
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)   
(...)
at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260)   
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)   
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)   
at java.lang.Thread.run(Thread.java:662)   
Caused by: org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A
node is used in a
different document than the one
that created it.  
at org.apache.xerces.dom.ParentNode.internalInsertBefore(Unknown Source)  
at org.apache.xerces.dom.ParentNode.insertBefore(Unknown Source)  
at org.apache.xerces.dom.CoreDocumentImpl.insertBefore(Unknown Source)  
at org.apache.xerces.dom.NodeImpl.appendChild(Unknown Source)  
at org.jboss.ws.core.soap.SOAPDocument.appendChild(SOAPDocument.java:222)   
at org.jboss.ws.core.soap.SOAPPartImpl.appendChild(SOAPPartImpl.java:297)   
at org.apache.cxf.staxutils.W3CDOMStreamWriter.setChild(W3CDOMStreamWriter.java:119)   
at org.apache.cxf.staxutils.W3CDOMStreamWriter.newChild(W3CDOMStreamWriter.java:109)   
at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:137)   
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:122)   
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:81)   
at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:61)   
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)   
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)   
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:462)   
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:365)   
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)   
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:95)   
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)   
... 80 more  

これらのライブラリで動作します。

/org/apache/cxf/cxf-rt-frontend-jaxws/2.4.2/cxf-rt-frontend-jaxws-2.4.2.jar
/org/apache/cxf/cxf-api/2.4.2/cxf-api-2.4.2.jar
/org/apache/cxf/cxf-common-utilities/2.4.2/cxf-common-utilities-2.4.2.jar
/org/apache/cxf/cxf-rt-core/2.4.2/cxf-rt-core-2.4.2.jar
/org/apache/cxf/cxf-rt-frontend-simple/2.4.2/cxf-rt-frontend-simple-2.4.2.jar
/wsdl4j/wsdl4j/1.6.2/wsdl4j-1.6.2.jar
/org/apache/ws/xmlschema/xmlschema-core/2.0/xmlschema-core-2.0.jar
/org/apache/cxf/cxf-rt-bindings-soap/2.4.2/cxf-rt-bindings-soap-2.4.2.jar
/org/apache/cxf/cxf-tools-common/2.4.2/cxf-tools-common-2.4.2.jar
/org/apache/cxf/cxf-rt-databinding-jaxb/2.4.2/cxf-rt-databinding-jaxb-2.4.2.jar
/org/apache/cxf/cxf-rt-ws-addr/2.4.2/cxf-rt-ws-addr-2.4.2.jar
/org/apache/neethi/neethi/3.0.1/neethi-3.0.1.jar
/org/apache/cxf/cxf-rt-ws-security/2.4.2/cxf-rt-ws-security-2.4.2.jar
/org/apache/ws/security/wss4j/1.6.2/wss4j-1.6.2.jar
/commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar
/org/apache/cxf/cxf-rt-transports-http/2.4.2/cxf-rt-transports-http-2.4.2.jar
/org/apache/xmlsec/1.4.2/xmlsec-1.4.2.jar
/commons-io/commons-io/2.4/commons-io-2.4.jar

クライアントがWSSインターセプターなしで呼び出された場合、すべてが正常に機能します。

WSSインターセプターコード:

Client client = ClientProxy.getClient(port);
Endpoint cxfEndpoint = client.getEndpoint();
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.USER, "username_alex");
outProps.put(WSHandlerConstants.ADD_UT_ELEMENTS, WSConstants.NONCE_LN + " " +WSConstants.CREATED_LN);
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, this);
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
cxfEndpoint.getOutInterceptors().add(wssOut);

ここで何が起こるか考えていますか?

アップデート:

いくつかの追加のヒント。お役に立てば幸いです。

  1. Tomcatでアプリケーションを実行しようとしました。できます、
  2. このチケットのため:https ://issues.apache.org/jira/browse/CXF-4612?page = com.atlassian.jira.plugin.system.issuetabpanels:comment- tabpanel2つの追加バージョンのCXFを使用してアプリケーションをテストしました:2.5.7および2.5.8。失敗しました。
  3. 私のJBossの/lib/ endorsedには、SAAJの2つの実装があります。axis-saaj.jarとjboss-native-saaj.jarです。これらのライブラリを組み合わせてみたところ、両方がないと、WSSでWebサービスを処理するときにアプリケーションが配布されることがわかりました(アプリケーションは機能しますが、何も起こりませんでした。ブラウザとログの両方にエラーはありません)。
  4. また、axis-saajとjboss-native-saajを(別々に)アプリケーションのWARファイルに追加しようとしました。結果はポイント3に似ています。:アプリケーションの手。
4

1 に答える 1

1

この問題がまだ関連しているかどうかはわかりませんが、JBoss 6.1.0 でこの問題に直面したときにこの質問に遭遇しました。だから私は解決策を投稿しようと思いました。

JBoss は、SOAP メッセージの作成および処理中に関与する多くのファクトリのデフォルトを設定します。ここで特に問題を引き起こしているのはjavax.xml.soap.MessageFactory.

Apache CXF には、 というインターセプターがありSAAJOutInterceptorます。これは でハードコードされていorg.apache.cxf.binding.soap.interceptor.SoapOutInterceptorます。

確かではありませんが、ここでのアイデアは、SOAP メッセージを CXF 固有のオブジェクトからプラットフォーム固有のオブジェクトに変更することだと思います。そうしている間、初期化された MessageFactory はorg.jboss.ws.core.soap.MessageFactoryImpl. このクラスは jar から取得されcommon/lib/jbossws-native-core.jarます。

強引な解決策の 1 つは、この jar を取り除くことです。私たちのアプリケーションでは問題は発生しませんでした。しかし、より適切な解決策はMETA-INF/services/javax.xml.soap.MessageFactory、アプリケーションのクラスパスでこの正確な構造でファイルを定義することにより、JBoss MessageFactory をオーバーライドすることです。

WAR ファイルの場合、WEB-INF/classes の下に配置する必要があります。このファイルには、次のような 1 行が含まれます。

com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl

この変更を行った後、JBoss プロセスを再起動します。これが誰にとってもうまくいくことを願っています。

于 2016-01-12T17:54:01.997 に答える