2012-10-08 1 views
0

(기존 이유로) 서로 다른 공급자 엔드 포인트에 사용 된 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)

답변

0

사용 된 CXF 버전은 언급하지 않았습니다. 확실히 최신 버전을 사용해보십시오 (현재 2.6.2가 투표 중입니다). 최근 여러 SAAJ 구현을 사용할 수있게하는 작업이 최근에있었습니다. 최신 CXF로 업데이트하면 문제가 해결 될 수도 있습니다.

그래도 도움이되지 않는다면 "org.apache.cxf.binding.soap.messageFactoryClassName"및/또는 "org.apache.cxf.binding.soap.soap.FactoryClassName"이라는 시스템 속성을 적절한 값으로 설정할 수 있습니다 썬 클래스 이름과해야 작동합니다.

+0

사용중인 CXF 버전이 2.2.10이고 Axis 버전이 AXIS2 1.4.1입니다. org.apache.cxf.binding.soap.messageFactoryClassName은 CXF 버전의 시스템 특성으로 사용할 수 없습니다. 또한 AXIS2 버전을 최신 버전과 가장 최신 버전에 부딪히지 만 문제를 해결하지는 못했습니다. 사실 기존의 애플 리케이션 인 WSS4J가 업그레이드 된 의존성을 모두 필요로한다는 사실 때문에 CXF 업그레이드를 연기했다. –

+0

그냥이 문제에 대한 일부 종결을 가져온다. 문제), 언급 한 AXIS2 버전으로 CXF를 업그레이드 할 수없는 것처럼 보입니다. 그들은 둘 다 XmlSchema lib에 의존성을 가지고 있기 때문입니다. 그러나 그들은 서로 다른 버전이 필요합니다. 그래서 데이터 바인딩을 위해 AXIS2와 JAxB를 사용했습니다. –