2013-01-31 4 views
2

나는 콘솔에서 작동하지만, 제이 보스에서 실행할 때 같은 예외가 발생 WSS 인터셉터와 CXF 웹 서비스 클라이언트가 예기치 않은 예외가 발생 WRONG_DOCUMENT_ERR 때 보스 5.1.0GA에서 WSS 인터셉터와 CXF 클라이언트를 호출

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 

은 해당 라이브러리와 함께 작동 : 클라이언트가 WSS 인터셉터없이 호출되면

/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 요격 코드 :

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. 제 JBoss의/lib/endorsed에는 SAAJ의 두 가지 구현 인 axis-saaj.jar와 jboss-native-saaj.jar이 있습니다. 나는 그 라이브러리들을 결합하려고 시도했는데 WSS로 웹 서비스를 처리 할 때 (애플리케이션은 작동하지만 아무 일도 일어나지 않았다 : 브라우저와 로그 모두에 에러가 없다), 둘 다 응용 프로그램을 배포하지 않고 발견했다.
  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으로 하드 코딩되어 있습니다.

확실치 않지만 여기서는 SOAP 메시지를 CXF 특정 개체에서 플랫폼 특정 개체로 변경하는 방법을 사용합니다. MessageFactory를 초기화하는 동안 초기화되는 값은 org.jboss.ws.core.soap.MessageFactoryImpl입니다. 이 클래스는 항아리 common/lib/jbossws-native-core.jar에서옵니다.

하나의 무력의 해결책은이 항아리를 제거하는 것입니다. 우리의 응용 프로그램에는 아무런 문제도 발생하지 않았습니다. 그러나보다 정확한 해결책은 응용 프로그램의 classpath에 정확한 구조 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 프로세스를 다시 시작하십시오. 희망은 모든 사람들에게 효과적입니다.