2013-01-31 66 views
2

我有WSS拦截,从控制台的作品,但是从JBoss的运行时抛出异常一样,CXF Web服务客户端:WRONG_DOCUMENT_ERR当调用CXF客户端提供的JBoss 5.1.0GA WSS拦截

意外的异常

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-tabpanel我测试了应用程序与CXF的另外两个版本:2.5.7和2.5.8。它失败了。
  3. 在/ lib /认可我的JBoss我有两个SAAJ实现:axis-saaj.jar和jboss-native-saaj.jar。我尝试将这些库结合起来,并发现如果没有这两个应用程序,在使用WSS处理Web服务时应用程序发出(应用程序有效,但没有任何事情发生:浏览器和日志中都没有错误),
  4. 我也尝试添加轴-saaj和jboss-native-saaj(分别)添加到应用程序的WAR文件。结果类似于第3点:应用指针。

回答

1

不确定这个问题是否仍然相关,但是当我在JBoss 6.1.0上遇到这个问题时遇到了这个问题。所以我想我会发布一个解决方案。

JBoss在创建和处理SOAP消息期间为涉及的许多工厂设置默认值。特别是造成这个问题的那个是javax.xml.soap.MessageFactory

Apache CXF有一个叫做SAAJOutInterceptor的拦截器。这是在org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor硬编码。

我不确定,但我认为这里的想法是将CXF特定对象中的SOAP消息更改为特定于平台的对象。这样做时,初始化的MessageFactory是org.jboss.ws.core.soap.MessageFactoryImpl。这堂课来自罐子common/lib/jbossws-native-core.jar

一个蛮力解决方案将摆脱这个罐子。它在我们的应用程序中没有产生任何问题。但更合适的解决方案是通过在应用程序的类路径中定义一个具有此结构META-INF/services/javax.xml.soap.MessageFactory的文件来覆盖JBoss MessageFactory。

对于WAR文件,它必须放在WEB-INF/classes下。这个文件有一个单行,如下所示:

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

在进行此更改后重新启动JBoss进程。希望这适用于每个人。