0

私はJ2EEアプリを持っていますが、これは(レガシーの理由で)両方ともアプリケーションで使用される異なるプロバイダーエンドポイントに使用されるAxis2ライブラリとCXFライブラリの両方を備えています。

CXFを介してサードパーティプロバイダーに接続する新しいクライアントエンドポイントを実装しました。エンドポイントでは、認証の詳細を(HTTPヘッダーではなく)SoapHeadersに配置する必要があります。

春の設定は次のとおりです。

<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)

4

1 に答える 1

0

使用されているCXFのバージョンについては言及していません。必ず最新バージョンを使用してみてください (現在 2.6.2 ですが、現在 2.6.3 が投票されています)。最近、さまざまな古い SAAJ 実装を使用可能にするための作業が行われました。最新の CXF に更新するだけで問題が解決する場合があります。

それでも問題が解決しない場合は、「org.apache.cxf.binding.soap.messageFactoryClassName」および/または「org.apache.cxf.binding.soap.soapFactoryClassName」のシステム プロパティを適切な Sun クラス名に設定し、動作するはずです。

于 2012-10-08T18:59:19.987 に答える