java - 使用 Agesi 从 xfire 迁移到使用 Jaxb 的 CXF

标签 java web-services jaxb cxf xfire

我正在将使用 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/

相关文章:

java - 从 extjs 打印 pdf - 最佳解决方案

java - 如何检查 JOptionPane 输入是否包含 int 或 double 以及 2 个 if 语句并已转换?

java - 构建 RESTful 服务代码的正确方法

java - Tomcat RESTful Web 服务部署

java - JAX WS 客户端和 SSL 握手异常

java - 通过 javax.xml 更改日期格式输出

Java 聊天应用程序 - 多种字体、插入表情符号和表格的问题

java - 比较具有精确值匹配和相似值匹配的两个列表(使用 Java)

java - 将 XML 属性的值限制为不同属性/元素的值

java - JAXB 无法使用非参数构造函数编码和解码 Opensaml 和 Openws 对象?