web-dev-qa-db-fra.com

Importation de 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 est référencé mais non défini.

D'une manière ou d'une autre, il semble y avoir un conflit entre les importations wsdl et xsd - mais je ne peux pas le résoudre.

28
IUnknown

Vous avez quelques problèmes ici.

Premièrement, le XSD a un problème où un élément est à la fois nommé ou référencé; dans votre cas doit ê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:

  • Supprimez la déclaration de l'élément global Stock
  • Créez une déclaration de type complexe pour un type nommé Stock

Alors:

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

À:

<xsd:complexType name="Stock">

Assurez-vous de corriger les balises de fermeture xml.

Le deuxième problème est que la bonne façon de référencer un XSD externe est d'utiliser le schéma XSD avec import/include dans un élément wsdl: types. wsdl: import est réservé au référencement d'autres fichiers WSDL. Pour plus d'informations, consultez la spécification WS-I, section WSDL et importation de schéma . Basé sur WS-I, votre cas serait:

INCORRECT: (la façon dont vous l'avez 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>

[~ # ~] certains processeurs [~ # ~] peuvent prendre en charge les deux syntaxes. Le XSD que vous publiez présente des problèmes, assurez-vous d'abord de valider le XSD.

Il serait préférable de suivre la voie WS-I en ce qui concerne la création WSDL.

D'autres problèmes peuvent être liés à l'utilisation des URI relatifs et absolus pour localiser le contenu externe.

25
Petru Gardea

importation vs inclusion

Le but principal d'une importation est d'importer un namespace. Une utilisation plus courante de l'instruction d'importation XSD consiste à importer un espace de noms qui apparaît dans un autre fichier. Vous collectez peut-être les informations d'espace de noms à partir du fichier, mais n'oubliez pas que c'est l'espace de noms que vous importez, pas le fichier (ne confondez pas une instruction import avec une instruction include).

Un autre domaine de confusion est de savoir comment spécifier l'emplacement ou le chemin d'accès du fichier .xsd Inclus: Une instruction d'importation XSD a un attribut facultatif nommé schemaLocation mais ce n'est pas nécessaire si l'espace de noms de l'instruction d'importation se trouve au même emplacement (dans le même fichier) que l'instruction d'importation elle-même.

Lorsque vous choisissez d'utiliser un fichier externe .xsd Pour votre WSDL, l'attribut schemaLocation devient nécessaire. Assurez-vous que le namespace que vous utilisez 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 approche pour faire connaître le WSDL au sujet du XSD consiste à utiliser 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>

Vous pouvez en savoir plus à ce sujet dans ce grand article IBM . Il a des fautes de frappe comme xsd:import Au lieu de xs:import Mais sinon ça va.

11
Withheld