Agesiを使ったXfireからJAXBを使ったCXFへの移行
-
20-12-2019 - |
質問
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)