2014-04-11 3 views
1

jaxb를 사용하여 cxf로 데이터 바인딩하기 위해 aegis를 사용하는 xfire soap 프로젝트를 마이그레이션하고 있습니다. 새로운 axis 바인딩을 사용하는 xfire 요청을 처리하는 새로운 cxf 프로젝트가 있습니다. 하지만 jaxb unmarshalling errror로 데이터 바인딩을 이동하면 발생합니다.Agesi가있는 xfire에서 Jaxb로 CXF로 마이그레이션

이것은 내 cxf 웹 서비스 정의입니다.

<!--<bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" scope="prototype"/> --> 
    <bean id="jaxbBean" class="org.apache.cxf.jaxb.JAXBDataBinding" scope="prototype"/> 

<bean id="jaxws-and-aegis-service-factory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean" 
     scope="prototype"> 
    <property name="dataBinding" ref="jaxbBean"/> 
    <property name="serviceConfigurations"> 
     <list> 
      <bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/> 
      <bean class="org.apache.cxf.aegis.databinding.XFireCompatibilityServiceConfiguration"/> 
      <bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/> 
     </list> 
    </property> 
</bean> 

<jaxws:endpoint id="trace" address="/trace" implementor="#traceImplBean"> 
    <jaxws:serviceFactory> 
     <ref bean="jaxws-and-aegis-service-factory"/> 
    </jaxws:serviceFactory> 
    <jaxws:inInterceptors> 
     <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/> 
    </jaxws:inInterceptors> 
    <jaxws:outInterceptors> 
     <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> 
    </jaxws:outInterceptors> 
</jaxws:endpoint> 

다음과 같이 @ DTML에 @XMLRootElement Annotation을 사용했습니다. 그러나 난 XFire 메신저 이전 요청은 다음 생성

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pay="http://example.project.com"> 
     <soapenv:Header/> 
      <soapenv:Body> 
      <pay:trace> 
       <pay:context> 
       <keyValues> 
        <tag>tag</tag> 
        <value>value</value> 
       </keyValues> 
       </pay:context> 
      </pay:trace> 
     </soapenv:Body> 
     </soapenv:Envelope> 

CXF

대한 SOAP 요청 다음 생성하여 테스트

 @XmlRootElement(name = "context") 
    public class Context implements Serializable { 
      private KeyValues keyValues; 
      ..... 
     } 


    @XmlRootElement(name = "keyValues") 
    public class KeyValues implements Serializable { 
      private String tag; 
      private String value; 
      .... 
    } 

하나의 방법은, I 차이를 표시하게한다.

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pay="http://example.project.com" xmlns:api="http://example.com"> 
     <soapenv:Header/> 
      <soapenv:Body> 
       <pay:trace> 
        <pay:context> 
        <api:keyValues> 
         ***<api:KeyValues>*** 
          <api:tag>tag</api:tag> 
          <api:value>value</api:value> 
         ***</api:KeyValues>*** 
        </api:keyValues> 
        </pay:context> 
       </pay:trace> 
      </soapenv:Body> 
    </soapenv:Envelope> 

xfire 요청을 cxf 서비스로 보내려고하면 예외가 발생합니다.

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.project.com", local:"keyValues"). Expected elements are <{}keyValues> 

그래서 저는 xfire와 호환되도록 cxf 요청 인 더 추가 태그를 추가해야한다고 생각합니다. 아무도 이것을 해결하는 방법을 알고 있습니까?

미리 감사드립니다.

답변

2

기본적으로 JAXB는 규정되지 않은 요소를 사용하지만 Aegis/XFire는 기본적으로 한정 요소를 사용합니다. 그 주위의 몇 가지 방법 :

1) 모든 요소에 대해 네임 스페이스를 지정하십시오.

@XmlElement (이름 = "태그", 네임 스페이스 = "HTTP : ...")

가능성이 더 쉽게 :

2)와 package-info.java를 추가

@ javax.xml.bind.annotation.XmlSchema (namespace = "http : // ......", elementFormDefault = XmlNsForm.QUALIFIED)

+0

감사합니다. 그것은 질문의 일부를 해결하는 데 도움이됩니다. 이제 네임 스페이스는 괜찮지 만 래퍼 요소를 어떻게 생성 할 수 있습니까? @ XMLElementWrapper는 fileds에서 사용할 수 있지만 배열을 매개 변수로 사용하는 몇 가지 메소드가 있습니다. 이 xfire 비누 요청에는 cxf 요청에없는 래퍼가 있습니다. 내 질문을 참조하십시오, 나는 오래된 xfire 요청의 차이를 표시했습니다. – Viraj