(기존 이유로) 서로 다른 공급자 엔드 포인트에 사용 된 Axis2 및 CXF 라이브러리가 둘 다 사용되는 J2EE 응용 프로그램이 있습니다. 응용 프로그램에 의해.CXF OutInterceptor가 잘못된 SoapPartImpl 클래스를 사용하여 org.w3c.dom.DOMException이 발생합니다. HIERARCHY_REQUEST_ERR 예외
CXF를 통해 타사 공급자에 연결하는 새로운 클라이언트 끝점을 구현했습니다. 엔드 포인트는 HTTP 헤더가 아닌 SoapHeaders에 인증 세부 사항을 배치해야합니다. 연결 작업의 단순히 벌금과 인증에 실패의 outInterceptors없이
<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>
:
스프링 설정은 다음과 같습니다.
라인을 따라 어딘가에 인터셉터가 포함되면 코드는 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 버전이 2.2.10이고 Axis 버전이 AXIS2 1.4.1입니다. org.apache.cxf.binding.soap.messageFactoryClassName은 CXF 버전의 시스템 특성으로 사용할 수 없습니다. 또한 AXIS2 버전을 최신 버전과 가장 최신 버전에 부딪히지 만 문제를 해결하지는 못했습니다. 사실 기존의 애플 리케이션 인 WSS4J가 업그레이드 된 의존성을 모두 필요로한다는 사실 때문에 CXF 업그레이드를 연기했다. –
그냥이 문제에 대한 일부 종결을 가져온다. 문제), 언급 한 AXIS2 버전으로 CXF를 업그레이드 할 수없는 것처럼 보입니다. 그들은 둘 다 XmlSchema lib에 의존성을 가지고 있기 때문입니다. 그러나 그들은 서로 다른 버전이 필요합니다. 그래서 데이터 바인딩을 위해 AXIS2와 JAxB를 사용했습니다. –