WRONG_DOCUMENT_ERR при вызове веб-службы Java - SOAP / CXF - PullRequest
0 голосов
/ 27 апреля 2020

Я переношу приложение, работающее с 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 контекста весны, пытается его изменить, таким образом сообщение: Узел используется в документе, отличном от того, который его создал

Любая помощь приветствуется. Спасибо.

...