web-services - 将 xsd 导入 wsdl

标签 web-services xsd wsdl wsdl2java

这是我目前的配置:

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://stock.com/schemas/services/stock"
    xmlns:tns="http://stock.com/schemas/services/stock"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified"  targetNamespace="http://stock.com/schemas/services/stock">

<xsd:element name="Stock">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ticker" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="quotes" nillable="true" type="Quote"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:complexType name="Quote">
    ........
</xsd:complexType>
.......
<xsd:element name="gethighBetaStockResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

WSDL
<?xml version="1.0" encoding="UTF-8"?><definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
<import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" />
<message name="getStockQuoteResp">
    <part name="parameters" element="external:getStockQuoteResponse" />
</message>

但是,当 ref="Stock"更改为 type="Stock"时,wsdl2java 开始给出
类型 {http://stock.com/schemas/services/stock}Stock 被引用但未定义。

不知何故,这似乎是 wsdl 和 xsd 导入之间的冲突 - 但我无法解决它。感谢帮助。

最佳答案

你在这里有几个问题。

首先,XSD 存在一个元素既被命名又被引用的问题;在你的情况下应该被引用。

改变:

<xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/> 

到:
<xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/> 

和:
  • 删除全局元素的声明 Stock
  • 为名为 Stock 的类型创建复杂类型声明

  • 所以:
    <xsd:element name="Stock">
        <xsd:complexType>
    

    到:
    <xsd:complexType name="Stock">
    

    确保修复 xml 结束标记。

    第二个问题是引用外部 XSD 的正确方法是在 wsdl:types 元素中使用带有 import/include 的 XSD 模式。 wsdl:import 保留用于引用其他 WSDL 文件。更多信息可通过 WS-I 规范的 WSDL and Schema Import 部分获得。 .基于 WS-I,您的情况将是:

    错误: (你展示的方式)
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
        .....xmlns:external="http://stock.com/schemas/services/stock"
        <import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" />
        <message name="getStockQuoteResp">
            <part name="parameters" element="external:getStockQuoteResponse" />
        </message>
    </definitions>
    

    正确:
    <?xml version="1.0" encoding="UTF-8"?>
    <definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
        .....xmlns:external="http://stock.com/schemas/services/stock"
        <types>
            <schema xmlns="http://www.w3.org/2001/XMLSchema">
                <import namespace="http://stock.com/schemas/services/stock" schemaLocation="Stock.xsd" />             
            </schema>
        </types>
        <message name="getStockQuoteResp">
            <part name="parameters" element="external:getStockQuoteResponse" />
        </message>
    </definitions>
    

    一些 处理器可能支持这两种语法。您发布的 XSD 显示问题,请确保首先验证 XSD。

    如果您在 WSDL 创作方面采用 WS-I 方式会更好。

    其他问题可能与在定位外部内容时使用相对 URI 和绝对 URI 相关。

    关于web-services - 将 xsd 导入 wsdl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12120589/

    相关文章:

    ios - 为什么我没有收到 eBay 的产品价格回复?

    xml - JaxB 在从 XSD 生成枚举时添加 undescore(_)

    xml - 错误 : It was detected that 'sites' has no namespace, 但没有目标命名空间的组件无法从架构文档中引用

    tomcat - Tomcat 6 中没有部署基于 JAX-WS 的 Web 服务的 WSDL

    java - 我可以使用什么 Java 库来处理 WSDL 文件?

    PHP SoapClient 构造函数非常慢

    python - 如何使用 Gevent 为 python Bottle 实现 TLS/SSL

    apache-flex - 生成 swf 文件

    java - 如何让Tomcat为其提供的WS发布WSDL(CXF 2.2、Spring 3、Tomcat6)

    java - 如何使用 JAXB 和 XJC 编写我的 XSD 以匹配所需的 XML 和 Java 格式