我有一个J2EE应用程序(由于遗留原因),Axis2和CXF库都用于应用程序使用的不同提供者端点。
我已经实现了一个新的客户端点,通过CXF连接到第三方提供商。端点要求将身份验证详细信息放入SoapHeaders(而不是HTTP头)。
弹簧配置如下:
<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”。甚至在触及密码回调方法之前。 stacktrace:
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)
答案 0 :(得分:0)
您没有提及使用的CXF版本。绝对尝试使用最新版本(2.6.2现在,虽然2.6.3现在正在投票)。最近有一些工作可以使各种旧的SAAJ实现可用。只需更新到最新的CXF就可以解决它。
如果这没有帮助,您可以将“org.apache.cxf.binding.soap.messageFactoryClassName”和/或“org.apache.cxf.binding.soap.soapFactoryClassName”的系统属性设置为相应的Sun类名和应该工作。