Importer xsd dans wsdl
voici ma configuration actuelle:
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>
cependant, au moment où ref= "Stock" est changé en type = "Stock", le wsdl2java commence à donner Type {http://stock.com/schemas/services/stock}Stock référencé mais non défini.
D'une certaine façon, il semble un conflit entre WSDL et les importations xsd - mais je ne peux pas résoudre.L'aide est appréciée.
2 réponses
vous avez quelques problèmes ici.
tout d'abord, le XSD a un problème où un élément est à la fois nommé ou référencé; dans votre cas devrait être référencé.
changement:
<xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/>
À:
<xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/>
Et:
- supprimer la déclaration de l'élément global
Stock
- créer une déclaration de type complexe pour un type nommé
Stock
Donc:
<xsd:element name="Stock">
<xsd:complexType>
À:
<xsd:complexType name="Stock">
assurez-vous de corriger les balises de fermeture xml.
le second problème est que la bonne façon de faire référence à un XSD externe est d'utiliser le schéma XSD avec import/include dans un élément WSDL:types. WSDL: l'importation est réservée au référencement d'autres fichiers WSDL. Plus d'informations sont disponibles en passant par la spécification WS-I, section WSDL et le Schéma d'Importation. Basé sur WS-I, votre cas serait:
INCORRECT: (la façon dont vous l'a montré)
<?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>
CORRECT:
<?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>
les processeurs peuvent supporter les deux syntaxes. Le XSD que vous lancez montre des problèmes, assurez-vous d'abord de valider le XSD.
il serait préférable que vous suiviez la méthode WS-I en ce qui concerne la création de WSDL.
D'autres problèmes peuvent être liés à l'utilisation d'URI relatifs ou absolus pour localiser les URI externes. contenu.
importer vs include
Le but primaire d'une importation pour importer un namespace. Une utilisation plus courante de la déclaration d'importation XSD est d'importer un namespace qui apparaît dans un autre fichier. Vous pouvez être en train de rassembler les informations de l'Espace-nom à partir du fichier, mais n'oubliez pas que c'est le namespace que vous importez, le fichier (ne confondez pas un import
déclaration include
déclaration.)
une autre zone de confusion est la façon de spécifier l'emplacement ou le chemin du .xsd
fichier: une déclaration d'importation XSD a un attribut optionnel nommé schemaLocation
mais il n'est pas nécessaire si l'espace de noms de l'instruction d'importation est au même endroit (dans le même fichier) que l'instruction d'importation elle-même.
lorsque vous avez choisi d'utiliser un .xsd
fichier pour votre WSDL, le schemaLocation
l'attribut devient nécessaire. Être certain que le namespace vous utiliser dans l'instruction d'importation est le même que le targetNamespace du schéma que vous importez. Autrement dit, les 3 occurrences doivent être identiques:
WSDL:
xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>
XSD:
<xsd:schema targetNamespace="urn:listing3"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
une autre façon de faire connaître le WSDL à propos du XSD est d'utiliser le pom de Maven.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>
vous pouvez lire plus à ce sujet dans ce grande IBM article. Il a des fautes de frappe xsd:import
au lieu de xs:import
mais sinon c'est très bien.