Я переношу приложение, работающее с java 1.7 и jboss-eap-6.1, на java 1.8 и wildfly 18.0.0.Final.
Все работает довольно хорошо, но я Возникла проблема при вызове определенного внешнего веб-сервиса с использованием SOAP.
У меня возникает эта ошибка при вызове сервиса:
Caused by: org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: A node is used in a different document than
the one that created it.
at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(ParentNode.java:357)
at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(ParentNode.java:288)
at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:237)
at org.apache.wss4j.dom.util.WSSecurityUtil.prependChildElement(WSSecurityUtil.java:375)
at org.apache.wss4j.dom.util.WSSecurityUtil.findWsseSecurityHeaderBlock(WSSecurityUtil.java:497)
at org.apache.wss4j.dom.message.WSSecHeader.insertSecurityHeader(WSSecHeader.java:167)
at org.apache.wss4j.dom.handler.WSHandler.doSenderAction(WSHandler.java:117)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor.access$100(WSS4JOutInterceptor.java:57)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessageInternal(WSS4JOutInterceptor.java:275)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessage(WSS4JOutInterceptor.java:147)
at org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor$WSS4JOutInterceptorInternal.handleMessage(WSS4JOutInterceptor.java:132)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
... 112 more
Все остальные сервисы работают, кроме этого , Когда я смотрю на весенний контекстный файл xml, я вижу, что этот сервис имеет дополнительную конфигурацию, которая является WSS4JOutInterceptor bean.
<bean id="outInterceptorWSS" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<property name="properties">
<map>
<entry key="action" value="UsernameToken"/>
<entry key="mustUnderstand" value="false"/>
<entry key="user" value="username here"/>
<entry key="passwordType" value="PasswordNone"/>
<entry key="passwordCallbackClass"
value="PasswordHandler package here"/>
</map>
</property>
</bean>
<bean id="myServiceFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"
value="service package here"/>
<property name="address"
value="endpointUrl here"/>
<property name="username"
value="username here"/>
<property name="password"
value="password here"/>
<property name="outInterceptors" ref="outInterceptorWSS"/>
<property name="bus" ref="cxf"/>
</bean>
outInterceptorWSS bean используется для добавления заголовка безопасности в сообщение soap перед вызовом внешнего веб-сервиса. Служба работает задолго до миграции (java 1.7 и jboss-eap-6-1), но не работает после миграции (java 1.8 и wildfly-18.0.0.Final).
Я не уверен на 100%, но мое понимание этой проблемы заключается в том, что wildfly создает сообщение soap, а bean-компонент outInterceptorWS , определенный в контексте xml контекста весны, пытается его изменить, таким образом сообщение: Узел используется в документе, отличном от того, который его создал
Любая помощь приветствуется. Спасибо.