这是我目前的配置:
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 =“股票”被改变为type =“股票”,中的WSDL2Java开始给类型{http://stock.com/schemas/services/stock}Stock被引用但没有定义。
不知怎的,似乎WSDL和XSD进口之间的冲突 - 但我只是不能化解it.Help表示赞赏。
你有几个问题在这里。
首先,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正确的方法是使用XSD模式与进口/包括一个wsdl内:types元素。 WSDL:进口被保留到引用其他WSDL文件。 更多信息可通过该WS-I规范,部分去WSDL和Schema导入 。 基于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。
如果你去了WS-I的方式,当它涉及到WSDL创作这将是更好的。
其他问题可能与在定位外部内容的使用相对与绝对URI的。
进口与包括
进口的主要目的是导入命名空间 。 在XSD import语句的一个更常见的用途是导入出现在另一个文件中的命名空间 。 你可能会收集来自该文件的命名空间信息,但不要忘记,这是您导入,而不是文件 (不要混淆的名称空间 import
与语句include
语句)。
混乱的另一个领域是如何指定包括位置或路径.xsd
文件:一个XSD import语句有一个可选的属性命名schemaLocation
在同一个,但如果 import语句的命名空间是在相同的位置,没有必要(文件)作为导入语句本身。
当你选择使用一个外部.xsd
文件为您的WSDL的schemaLocation
属性成为必要。 非常肯定的说,你在import语句使用的命名空间是一样的,你所导入模式的targetNamespace。 也就是说,所有出现3次必须是相同的:
WSDL:
xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>
XSD:
<xsd:schema targetNamespace="urn:listing3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
另一种方法来让知道WSDL有关XSD是基于Maven的pom.xml:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xmlbeans-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-sources-xmlbeans</id>
<phase>generate-sources</phase>
<goals>
<goal>xmlbeans</goal>
</goals>
</execution>
</executions>
<version>2.3.3</version>
<inherited>true</inherited>
<configuration>
<schemaDirectory>${basedir}/src/main/xsd</schemaDirectory>
</configuration>
</plugin>
您可以在此阅读更多关于这个伟大的IBM文章 。 它有错别字,如xsd:import
替代xs:import
但除此之外,它的罚款。