我正在将使用 aegis 进行数据绑定(bind)的 xfiresoap 项目迁移到带有 jaxb 的 cxf。我让新的 cxf 项目可以通过 aegis 绑定(bind)来处理旧的 xfire 请求。但是当我将数据绑定(bind)移动到 jaxb 解码时发生错误。
这是我的 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 Annotaion,如下所示。
@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 的肥皂请求生成的
<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>
所以我认为我需要向 cxf 请求添加额外的标签才能与 xfire 兼容。有谁知道如何解决这个问题吗?
提前致谢。
最佳答案
JAXB 默认情况下使用非限定元素,而 Aegis/XFire 默认情况下使用限定元素。解决这个问题的几种方法:
1) 对于每个元素,指定 namespace 。
@XmlElement(name = "tag", 命名空间 = "http:...")
可能更容易:
2) 添加 package-info.java :
@javax.xml.bind.annotation.XmlSchema(命名空间 = "http://......", elementFormDefault = XmlNsForm.QUALIFIED)
关于java - 使用 Agesi 从 xfire 迁移到使用 Jaxb 的 CXF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003505/