【问题标题】:"Attribute group must have ref name set" when generate an OTA CXF Web Service Client生成 OTA CXF Web 服务客户端时“属性组必须设置引用名称”
【发布时间】:2014-11-21 02:05:15
【问题描述】:

我正在使用 Apache CXF 运行时从已发布的 WSDL 生成 Web 服务客户端

此 WSDL 是通过 Open Travel Org (OTA) 提供的 XDS 生成的,我确信它是正确的,但我同样放在这里。

我的问题是,当使用 Eclipse Kepler 的“创建 Web 服务”工具(使用 CXF 运行时 2.7.10 和 java 7u71)时,CXF 控制台收到此错误消息:属性组必须设置引用名称

    WSDLToJava Error: java.lang.RuntimeException: org.apache.ws.commons.schema.XmlSchemaSerializer$XmlSchemaSerializerException: Attribute group must have ref name set

    org.apache.cxf.tools.common.ToolException: java.lang.RuntimeException: 
    org.apache.ws.commons.schema.XmlSchemaSerializer$XmlSchemaSerializerException:
    Attribute group must have ref name set
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:420)
        at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:103)
        at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:113)
        at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86)
        at org.apache.cxf.tools.wsdlto.WSDLToJava.main(WSDLToJava.java:184)
    Caused by: java.lang.RuntimeException: 
    org.apache.ws.commons.schema.XmlSchemaSerializer$XmlSchemaSerializerException: 
    Attribute group must have ref name set
        at org.apache.cxf.tools.wsdlto.databinding.jaxb.JAXBDataBinding.addSchemas(JAXBDataBinding.java:642)
        at org.apache.cxf.tools.wsdlto.databinding.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:443)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.generateTypes(WSDLToJavaContainer.java:714)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.processWsdl(WSDLToJavaContainer.java:270)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:164)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:412)
... 4 more
    Caused by: 
    org.apache.ws.commons.schema.XmlSchemaSerializer$XmlSchemaSerializerException: Attribute group must have ref name set
        at org.apache.ws.commons.schema.XmlSchemaSerializer.serializeAttributeGroupRef(XmlSchemaSerializer.java:562)
        at org.apache.ws.commons.schema.XmlSchemaSerializer.serializeAttributeGroup(XmlSchemaSerializer.java:523)
        at org.apache.ws.commons.schema.XmlSchemaSerializer.serializeSchemaChild(XmlSchemaSerializer.java:2406)
        at org.apache.ws.commons.schema.XmlSchemaSerializer.serializeSchemaElement(XmlSchemaSerializer.java:1659)
        at org.apache.ws.commons.schema.XmlSchemaSerializer.serializeSchema(XmlSchemaSerializer.java:132)
        at org.apache.cxf.tools.wsdlto.databinding.jaxb.JAXBDataBinding.addSchemas(JAXBDataBinding.java:640)
... 9 more

通过 Tomcat 控制台显示一个很长的 stachtraces,其中包含“对等方重置连接:套接字写入错误”错误

要部署的 WSDL 如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions 
            name="OTA_VehAvailRateService" 
            xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema"      

            targetNamespace="http://www.opentravel.org/OTA/2003/05"
            xmlns:ota="http://www.opentravel.org/OTA/2003/05">

        <wsdl:types>
            <xs:schema>
                <xs:import namespace="http://www.opentravel.org/OTA/2003/05" schemaLocation="OTA_VehAvailRateRQ.xsd" />
            </xs:schema>
            <xs:schema>
                <xs:import namespace="http://www.opentravel.org/OTA/2003/05" schemaLocation="OTA_VehAvailRateRS.xsd" />
            </xs:schema>        
        </wsdl:types>

      <wsdl:message name="OTA_VehAvailRateRequest"> 
        <wsdl:part element="ota:OTA_VehAvailRateRQ" name="parameters"/>
      </wsdl:message>
      <wsdl:message name="OTA_VehAvailRateResponse">
        <wsdl:part element="ota:OTA_VehAvailRateRS" name="parameters"/>
      </wsdl:message>

      <wsdl:portType name="OTA_VehAvailRatePortType">
        <wsdl:operation name="OTA_VehAvailRateAction">
          <wsdl:input message="ota:OTA_VehAvailRateRequest"/>
          <wsdl:output message="ota:OTA_VehAvailRateResponse"/>
        </wsdl:operation>
      </wsdl:portType>  

      <wsdl:binding name="OTA_VehAvailRateSOAPBinding" type="ota:OTA_VehAvailRatePortType">
        <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="OTA_VehAvailRateAction">
          <soap12:operation soapAction="OTA_VehAvailRateSoapAction" style="document"/>

          <wsdl:input>
            <soap12:body use="literal"/>
          </wsdl:input>

          <wsdl:output>
            <soap12:body use="literal"/>
          </wsdl:output>

        </wsdl:operation>
      </wsdl:binding> 


      <wsdl:service name="OTA_VehAvailRateService">
        <wsdl:port name="OTA_VehAvailRatePort" binding="ota:OTA_VehAvailRateSOAPBinding">
          <soap12:address location="http://172.26.0.40:85/WebServiceAmadeus/services/OTA_VehAvailRatePort"/>
        </wsdl:port>
      </wsdl:service>   

    </wsdl:definitions>

更新:

我认为这不是架构定义的原因,因为:

  • 架构由 OTA(国际旅行经纪人网络服务标准)提供
  • 如果我使用同一工作区的本地地址来部署 Web 服务客户端,则效果很好。即:

改为使用:

    http://172.26.0.40:85/WebServiceAmadeus/services/OTA_VehAvailRatePort?wsdl

我用:

    /WebServiceAmadeus/WebContent/wsdl/KarveOta.wsdl

其中 WebServiceAmadeus 是同一工作区的项目文件夹。

当然这不是解决方案,因为只能在语言环境主机中工作。

更新

我曾尝试使用其他 CXF 版本(2.4.2、3.0.2 等)遇到同样的问题。 我尝试使用 SOAP 版本 1.1 时遇到同样的问题。 从 SOAP UI 5.0.0,我可以部署获取请求,但响应说 Unmarshalling Error: ?

【问题讨论】:

    标签: xsd cxf webservice-client wsdl2java


    【解决方案1】:

    OTA 也有同样的问题。我正在使用spring ws,对我来说,添加时问题就解决了

    <property name="inline" value="false"/>
    

    org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection

    【讨论】:

    • 是的,没错。但是如果我需要内联怎么办?
    【解决方案2】:

    这可能是您的 XML 架构中的错误。检查它是否使用&lt;xs:attributeGroup&gt; 元素来引用某个全局定义的属性组,如果使用,该元素是否具有ref 属性。

    【讨论】:

    • schema中有很多attributeGroup元素,但它们都有名字或引用..
    • 我检查了所有的参考文献有名字的元素
    【解决方案3】:

    Apache xmlschema-core library version 2+ 在 Spring-ws 从 OTA xsd 文件生成动态 wsdl 时导致以下异常。

    org.apache.ws.commons.schema.XmlSchemaException:

    属性组必须设置引用名称

    将 spring-xml.2.0.5.RELEASE (max) 与 XmlSchema.1.4.7 一起使用将解决 wsdl 生成问题,即使是 inline value="true"

    <dependency>
        <groupId>org.springframework.ws</groupId>
        <artifactId>spring-xml</artifactId>
        <version>2.0.5.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.ws.commons.schema</groupId>
        <artifactId>XmlSchema</artifactId>
        <version>1.4.7</version>
    </dependency>
    

    【讨论】:

      【解决方案4】:

      问题来自OTA标准的XSD文件,对于某些版本,没有定义命名空间和目标命名空间。

      例如:

      • 2006a版本,一切正常
      • 对于 2005b 版本,缺少命名空间和目标命名空间

      我认为这是某些定义中的错误,所以我添加了缺失的数据,保留了补丁...

      XmlSchema 库是一个旧库,与我项目中的其他库发生冲突。

      【讨论】:

        猜你喜欢
        • 2015-05-26
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多