web services - online - Importación de xsd a wsdl
wsdl tutorial español (2)
Tienes un par de problemas aquí.
En primer lugar, el XSD tiene un problema por el cual un elemento es nombrado o referenciado; en su caso debe ser referenciado.
Cambio:
<xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/>
A:
<xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/>
Y:
- Eliminar la declaración del elemento global
Stock
- Crear una declaración de tipo complejo para un tipo denominado
Stock
Asi que:
<xsd:element name="Stock">
<xsd:complexType>
A:
<xsd:complexType name="Stock">
Asegúrese de corregir las etiquetas de cierre xml.
El segundo problema es que la forma correcta de hacer referencia a un XSD externo es usar el esquema XSD con import / include dentro de un elemento wsdl: types. wsdl: import está reservado para hacer referencia a otros archivos WSDL. Se dispone de más información al consultar la especificación WS-I, la sección WSDL y la importación de esquemas . Basado en WS-I, su caso sería:
INCORRECTO: (la forma en que lo mostró)
<?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>
CORRECTO:
<?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>
ALGUNOS procesadores pueden admitir ambas sintaxis. El XSD que muestra muestra problemas, asegúrese de validar primero el XSD.
Sería mejor si usa WS-I cuando se trata de la creación de WSDL.
Otros problemas pueden estar relacionados con el uso de URI relativos vs. absolutos en la localización de contenido externo.
Esta es mi configuración actual:
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>
Sin embargo, en el momento en que ref = "Stock" se cambia a type = "Stock", el wsdl2java comienza a dar Tipo {http://stock.com/schemas/services/stock}Stock se hace referencia pero no se define.
De alguna manera, parece un choque entre las importaciones de wsdl y xsd, pero simplemente no puedo resolverlo. Se agradece la ayuda.
importar vs. incluir
El objetivo principal de una importación es importar un espacio de nombre . Un uso más común de la instrucción de importación XSD es importar un espacio de nombre que aparece en otro archivo. Puede que recopile la información del espacio de nombres del archivo, pero no olvide que es el espacio de nombres que está importando, no el archivo (no confunda una declaración de import
con una declaración de include
).
Otra área de confusión es cómo especificar la ubicación o ruta del archivo .xsd
incluido: Una declaración de importación XSD tiene un atributo opcional llamado schemaLocation
pero no es necesario si el espacio de nombres de la declaración de importación está en la misma ubicación (en el mismo archivo) como la declaración de importación en sí.
Cuando elige usar un archivo .xsd
externo para su WSDL, se vuelve necesario el atributo schemaLocation
. Asegúrese de que el espacio de nombre que usa en la declaración de importación sea el mismo que el espacio de destino del esquema que está importando. Es decir, las 3 apariciones deben ser idénticas:
WSDL:
xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>
XSD:
<xsd:schema targetNamespace="urn:listing3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Otro acercamiento para dejar saber el WSDL sobre el XSD es a través del pom.xml de Maven:
<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>
Puede leer más sobre esto en este gran artículo de IBM . Tiene errores tipográficos como xsd:import
lugar de xs:import
pero de lo contrario está bien.