Вопрос

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

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

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

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

и мои классы данных:открытый абстрактный класс Abstractattribute {string name;

  /*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 в целом не являются лучшими инструментами для использования в этом конкретном случае?

Это было полезно?

Решение

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

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

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

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

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

Надеюсь это ответит на твой вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top