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