Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用JBoss 5.1.0GA中的WSS侦听器调用CXF客户端时出错_Xml_Jboss_Cxf_Wss - Fatal编程技术网

Xml 使用JBoss 5.1.0GA中的WSS侦听器调用CXF客户端时出错

Xml 使用JBoss 5.1.0GA中的WSS侦听器调用CXF客户端时出错,xml,jboss,cxf,wss,Xml,Jboss,Cxf,Wss,我有一个带有WSS拦截器的CXF web服务客户端,它可以从控制台工作,但从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.Jax

我有一个带有WSS拦截器的CXF web服务客户端,它可以从控制台工作,但从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);
Client-Client=ClientProxy.getClient(端口);
端点cxfEndpoint=client.getEndpoint();
Map outProps=new HashMap();
put(WSHandlerConstants.ACTION,WSHandlerConstants.USERNAME\u令牌);
outProps.put(WSHandlerConstants.PASSWORD_类型,WSConstants.PW_文本);
put(wshandlerstants.USER,“username_alex”);
outProps.put(WSHandlerConstants.ADD_UT_元素,WSConstants.NONCE_LN+“”+WSConstants.CREATED_LN);
put(WSHandlerConstants.PW_CALLBACK_REF,this);
WSS4JOutInterceptor wssOut=新的WSS4JOutInterceptor(输出程序);
cxfEndpoint.getOutiterCeptors().add(wssOut);
你知道这里发生了什么吗

更新:

一些额外的提示。我希望这会有帮助:

  • 我试图在Tomcat上运行应用程序。它起作用了
  • 由于这个问题:我使用两个额外的CXF版本测试了应用程序:2.5.7和2.5.8。它失败了
  • 在JBoss的/lib/approved中,我有两个SAAJ实现:axis-SAAJ.jar和JBoss-native-SAAJ.jar。我尝试将这些库组合起来,发现如果没有它们,应用程序在使用WSS处理web服务时就会分发(应用程序工作,但什么也没发生:浏览器和日志中都没有错误)
  • 我还尝试将axis saaj和jboss原生saaj(分别)添加到应用程序的WAR文件中。结果与第3点相似:应用手

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

    JBoss为SOAP消息的创建和处理过程中涉及的许多工厂设置默认值。这里特别引起问题的是
    javax.xml.soap.MessageFactory

    apachecxf有一个名为
    SAAJOutInterceptor
    的拦截器。这是在
    org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor
    中硬编码的

    我不确定,但我认为这里的想法是将SOAP消息从特定于CXF的对象更改为特定于平台的对象。执行此操作时,初始化的MessageFactory是
    org.jboss.ws.core.soap.MessageFactoryImpl
    。此类来自jar
    common/lib/jbossws-native-core.jar

    一个蛮力的解决办法是扔掉这个罐子。它没有在我们的应用程序中产生任何问题。但一个更合适的解决方案是覆盖JBoss MessageFactory,方法是在应用程序的类路径上定义一个文件,该文件的结构为META-INF/services/javax.xml.soap.MessageFactory

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

    com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl
    
    进行此更改后重新启动JBoss进程。希望这对每个人都有效