Подтвердить что ты не робот

Импорт xsd в wsdl

Это моя текущая конфигурация:

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 import - но я просто не могу его разрешить. Приветствуется.

4b9b3361

Ответ 1

У вас здесь пара проблем.

Во-первых, у XSD есть проблема, когда элемент назван или указан; в вашем случае следует ссылаться.

Изменить:

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

To:

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

и

  • Удалить объявление глобального элемента Stock
  • Создать объявление сложного типа для типа с именем Stock

Итак:

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

To:

<xsd:complexType name="Stock">

Убедитесь, что вы установили теги закрытия xml.

Вторая проблема заключается в том, что правильным способом ссылки на внешний XSD является использование схемы XSD с импортом/включением в элемент wsdl: types. wsdl: импорт зарезервирован для ссылки на другие файлы WSDL. Более подробную информацию можно получить, просмотрев спецификацию WS-I, раздел WSDL и Import 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 при поиске внешнего контента.

Ответ 2

import vs. include

Основная цель импорта - импортировать пространство имен. Более распространенное использование оператора импорта XSD - это импорт пространства имен, которое появляется в другом файле. Вы можете собирать информацию о пространстве имен из файла, но не забывайте, что это пространство имен, которое вы импортируете, не файл (не путайте import с инструкцией include).

Еще одна проблема путаницы заключается в том, как указать местоположение или путь для включенного файла .xsd: оператор импорта XSD имеет необязательный атрибут с именем schemaLocation, но нет необходимости , если пространство имен оператора импорта находится в том же месте (в том же файле), что и сам импорт.

Если вы выбрали внешний файл .xsd для своего WSDL, вам понадобится атрибут schemaLocation. Будьте уверены, что пространство имен, которое вы используете в инструкции import, совпадает с пространством targetNames схемы, которую вы импортируете. То есть все 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, но в остальном это нормально.