【问题标题】:CXF OutInterceptor uses the wrong SoapPartImpl class resulting in a org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR exceptionCXF OutInterceptor 使用错误的 SoapPartImpl 类导致 org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR 异常
【发布时间】:2012-10-08 05:33:32
【问题描述】:

我有一个 J2EE 应用程序(出于遗留原因),它同时具有 Axis2 和 CXF 库,用于应用程序使用的不同提供程序端点。

我已经实现了一个新的客户端端点,它通过 CXF 连接到第三方提供商。端点要求将身份验证详细信息放入 SoapHeaders(而不是 HTTP 标头)中。

spring 配置如下:

<jaxws:client id="fareSearchServicePort" serviceClass="org.openaxisgroup.axisschemadocs.v1r1_va.AxisPort"
              address="${endpoint}faresearch">
    <jaxws:features>
        <ref bean="gzipFeature"/>

        <ref bean="fastInfosetFeature"/>
        <!--<ref bean="loggingFeature"/>-->

    </jaxws:features>
    <jaxws:properties>
        <entry key="org.apache.cxf.binding.soap.messageFactoryClassName" value="com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl" />
    </jaxws:properties>
    <jaxws:outInterceptors>
        <ref bean="outPasswordInterceptor" />
    </jaxws:outInterceptors>
</jaxws:client>

<bean id="outPasswordInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameToken" />
            <entry key="passwordType" value="PasswordText" />
            <entry key="signaturePropFile" value="..."/>
            <entry key="passwordCallbackRef" value-ref="myPasswordCallback"/>
        </map>
    </constructor-arg>
</bean>

没有 outInterceptors,连接工作正常,只是无法进行身份验证。

在包含拦截器的情况下,代码被委托给 Axis2 库,从而导致“org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR”。甚至在密码回调方法被触摸之前。堆栈跟踪:

org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted. 
    at org.apache.axiom.om.impl.dom.ParentNode.insertBefore(ParentNode.java:224)
    at org.apache.axiom.om.impl.dom.NodeImpl.appendChild(NodeImpl.java:240)
    at org.apache.axis2.saaj.SOAPPartImpl.appendChild(SOAPPartImpl.java:979)
    at org.apache.cxf.staxutils.W3CDOMStreamWriter.setChild(W3CDOMStreamWriter.java:114)
    at org.apache.cxf.staxutils.W3CDOMStreamWriter.newChild(W3CDOMStreamWriter.java:104)
    at org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:132)
    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:244)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:516)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:313)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:265)                                                                                                           
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)                                                                                                      
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)                                                                                                  
    at $Proxy144.axisTransaction(Unknown Source)   

如何指定要使用的 SOAPPartImpl? (即 com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl)

【问题讨论】:

    标签: cxf axis2 wsdl2java


    【解决方案1】:

    您没有提及使用的 CXF 版本。一定要尝试使用最新版本(现在是 2.6.2,尽管现在正在对 2.6.3 进行投票)。最近有一些工作使各种较旧的 SAAJ 实现可用。只需更新到最新的 CXF 即可解决。

    如果这没有帮助,您可以将“org.apache.cxf.binding.soap.messageFactoryClassName”和/或“org.apache.cxf.binding.soap.soapFactoryClassName”的系统属性设置为适当的 Sun类名和应该工作。

    【讨论】:

    • 我使用的CXF版本是2.2.10,Axis的版本是AXIS2 1.4.1。看起来 org.apache.cxf.binding.soap.messageFactoryClassName 不能作为该版本 CXF 的系统属性使用。也尝试过升级 AXIS2 版本(最新和最好的),但这似乎也无法解决问题。推迟进行 CXF 升级,因为它需要升级所有依赖项(WSS4J),这是一个遗留应用程序绑定到..
    • 只是为了解决这个问题(并帮助其他有同样问题的人),看起来不可能用提到的 AXIS2 版本升级 CXF。这是因为它们都依赖于 XmlSchema 库,但它们都需要不同的版本。所以我最终使用 AXIS2 和 JAxB 进行数据绑定。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2023-03-08
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多