質問

JAXBを使用してCXFにAEGISを使用するXFire SOAPプロジェクトをマイグレーションしています。AEGISバインディングで古いXFireリクエストのために作業する新しいCXFプロジェクトが得られました。ただし、データバインディングをJAXBに移動すると、unmarshallingエラーが発生します。

これは私のCXF Webサービス定義です。

   <!--<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>
.

私は次のように私のDTOに@xmlrootElementの注釈を使用しました。

     @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;
            ....
     }
.

CXFのSOAP要求を後続のSOAP要求に従ってテストした1つのメソッド

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

しかし古いXfireの発生後の要求を生成しました、違いをマークしました。

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

CXFサービスにXFireリクエストを送信しようとしたときに例外が発生しました。

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

だから私はXfireと互換性のあるCXF要求に追加のタグを追加する必要があると思います。誰もがこれを解決する方法を知っていますか?

事前にありがとうございました。

役に立ちましたか?

解決

JAXBは、デフォルトでは、既定の要素を使用していますが、デフォルトの既定の要素によるAEGIS / XFIRE。その周りのカップルの方法:

1)すべての要素について、ネームスペースを指定します。

@xmlElement(name="tag"、namespace="http:...")

おそらく簡単に:

2)PACKAGE-INFO.JAVAを追加します。

javax.xml.bind.annotation.xmlschema(namespace="http:// ......"、 ElementFormDefault= XMLNSForm.Qualified)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top