首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Jaxb从带有agesi的xfire迁移到CXF

用Jaxb从带有agesi的xfire迁移到CXF
EN

Stack Overflow用户
提问于 2014-04-11 04:25:14
回答 1查看 1.2K关注 0票数 1

我正在迁移我的xfire soap项目,该项目使用aegis将数据库绑定到使用jaxb的cxf。我让新的cxf项目使用aegis绑定处理旧的xfire请求。但是,当我将数据库移动到jaxb时,反编组错误就会发生。

这是我的cxf web服务定义。

代码语言:javascript
复制
   <!--<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,如下所示。

代码语言:javascript
复制
     @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请求之后生成的

代码语言:javascript
复制
     <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生成以下请求,我有标记的区别。

代码语言:javascript
复制
      <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请求时,出现了以下异常。

代码语言:javascript
复制
  javax.xml.bind.UnmarshalException: unexpected element (uri:"http://example.project.com", local:"keyValues"). Expected elements are <{}keyValues>

因此,为了与xfire兼容,我认为需要向cxf请求添加额外的标记。有人知道怎么解决这个问题吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-11 14:01:47

JAXB默认使用非限定元素,而Aegis/XFire默认使用限定元素。有几种方法可以解决这个问题:

1)对于每个元素,指定名称空间。

@XmlElement(name = "tag",命名空间=“http:.”)

可能更容易:

2)添加一个包-info.java,包含:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23003505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档