ось поколения wsdl - PullRequest
       11

ось поколения wsdl

3 голосов
/ 13 февраля 2009

Я использую Axis для моделирования образца WebService. Сейчас я пытаюсь понять, каковы ограничения автоматической генерации wsdl и кода.

Теперь для некоторого кода на стороне сервера:

это скелет примера веб-сервиса:

public class TestWebService {
  public AbstractAttribute[] testCall( AbstractAttribute someAttribute ) {
    ....

и мои классы данных: открытый абстрактный класс AbstractAttribute { Имя строки;

  /*get/set for name*/
  public abstract T getValue();
  public abstract void setValue(T value);
}

public class IntAttribute extends AbstractAttribute<Integer> {
  Integer value;
  public Integer getValue(){ return value; }
  public void setValue(Integer value){ this.value = value; }
}

public class StringAttribute extends AbstractAttribute<String> {
  String value;
  /* ok, you got the point, get/set for value field */
}

Инструмент eclipse для Axis2 с радостью сгенерирует wsdl из этих источников, включая схему для классов атрибутов:

<xs:complexType name="AbstractAttribute">
    <xs:sequence>
        <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="value" nillable="true" type="xs:anyType"/>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="IntAttribute">
    <xs:complexContent>
        <xs:extension base="xsd:AbstractAttribute">
            <xs:sequence>
                <xs:element minOccurs="0" name="value" nillable="true" type="xs:int"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="StringAttribute">
    <xs:complexContent>
        <xs:extension base="xsd:AbstractAttribute">
            <xs:sequence>
                <xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

Теперь, если вы видите что-то странное здесь, AbstractAttribute не имеет атрибута ** abstract = "true" ** и определяет элемент значения anyType, который переписывается в IntAttribute и StirngAttribute. Я даже не знаю, является ли это законной схемой (кстати, я не думаю, что это законно).

Более того, если я попытаюсь сгенерировать клиента из этого wsdl (всегда используя инструменты eclipse), сгенерированные источники не будут компилироваться, потому что AbstractAttribute определяет

Object localValue;
Поле

и атрибут Int / String определяют

int localValue;

и

String localValue;

.. Я попытался "разместить" источники (без особых надежд, очевидно), и в результате сервер попытался создать экземпляр AbstractAttribute (выбрасывая исключение InstantiationException).

Итак, мой вопрос: есть способ моделировать что-то вроде модели данных, описанной выше, или веб-сервисы и схемы XML в целом не являются лучшими инструментами для использования в этом конкретном случае?

1 Ответ

4 голосов
/ 16 февраля 2009

Чтобы объяснить проблему, с которой вы сталкиваетесь, полезно подумать о том, что нужно делать Axis при вызове вашего сервиса.

Axis - это просто веб-приложение на Java ... когда оно получает запрос на услугу, оно ищет соответствие, которое вы для него определили. Если он находит сопоставление, он пытается создать экземпляр необходимых классов, которые вы определили для обслуживания запроса.

Если вы определили классы как абстрактные или как интерфейсы, вы получите InstantiationExceptions, поскольку эти типы не могут быть созданы. Когда Axis попытался создать wsdl, он не сможет определить, какой тип поместить, поэтому он будет использовать «anyType».

Чтобы ответить на ваш вопрос: вы МОЖЕТЕ использовать модель, указанную выше, в своем коде, но вы не сможете использовать эти классы с Axis. Что мы обычно делаем в наших проектах:

  1. Определите классы, которые нам нужны, как в типичном объектно-ориентированном приложении
  2. Определить классы «только для транспорта», которые используются для веб-сервисов. Эти классы состоят из простых типов и могут быть легко созданы. Они используются только для обмена сообщениями веб-сервиса. Мы используем эти классы с Axis.
  3. Найдите способ для этих двух типов классов легко обмениваться информацией. Вы можете иметь интерфейсы, которые совместно используются обоими (но Axis не знает о них), или даже использовать BeanUtils.copyProperites для синхронизации двух разных объектов.

Надеюсь, что ответит на ваш вопрос.

...