Общая информация:
- Я использую Flex 4.5
- Я использую FlashBuilder 4
- Я генерирую WSDL, используя JAX-WS 2.2 (через GlassFish 3.1 AS)
Я хочу иметь веб-сервис, который возвращает список клиентов.
В коде Java у меня есть базовый класс для клиента и 2 расширяющих класса:
public class Client {
public String getName() {
return this.name;
}
}
public class AdvisedClient extends Client {
public String getFoo() {
return this.foo;
}
}
public class NotAdvisedClient extends Client {
public String getBar() {
return this.bar;
}
}
Эти классы являются POJO.
Веб-сервис выглядит так:
public class ClientsModel {
public List<Client> getClients() {
return this.clients;
}
}
@WebService
public class ClientService {
@WebMethod
public ClientsModel getClients(String bla) {
...
}
}
Я пытался использовать следующие методы для представления наследования в возможном WSDL:
http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-substitution.html
(Здесь я аннотировал все 3 класса с помощью @XmlRootElement, я также аннотировал ClientsModel с помощью @XmlRootElement, аннотировал ClientsModel.getClients () с помощью @XmlElementRef, а также аннотировал ClientsModel с помощью @XmlSeeAlso, так что AdCentX признал, что JA классы).
http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-xsitype.html
(Здесь я аннотировал только класс Client с @XmlRootElement и оставил расширяющие классы как есть, а также удалил аннотацию @XmlElementRef).
Для первого подхода (подстановки) я получил следующую схему:
<xs:complexType name="ClientsModel">
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="tns:AdvisedClient" />
<xs:element ref="tns:NotAdvisedClient" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Client">
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="AdvisedClient">
<xs:complexContent>
<xs:extension base="tns:Client">
<xs:sequence>
<xs:element name="foo" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="NotAdvisedClient">
<xs:complexContent>
<xs:extension base="tns:Client">
<xs:sequence>
<xs:element name="bar" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
И когда я использовал мастер FlashBuilder «Подключиться к веб-службе», я получил класс ClientsModel, который содержит свойство для advisedClient и другое для notAdvisedClient, но НЕ в виде списков!
Затем я попробовал 2-й подход и получил следующую схему:
<xs:complexType name="ClientsModel">
<xs:sequence>
<xs:element name="clients" type="tns:Client" nillable="true" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
Принимая во внимание, что complexType для Client, AdvisedClient и NotAdvisedClient остались прежними.
После генерации классов в ActionScript с использованием FlashBuilder на этот раз я связал только класс Client, без AdvisedClient или NotAdvisedClient ...
Есть ли другой способ управления схемой с помощью JAXB, чтобы наследовать
Спасибо за ответ, для начала.
Извините, что не уточнил классы, созданные AS.
Я не имел в виду списки как таковые. Я имел в виду идею, что сгенерированный класс ClientsModel не содержит List / array / ArrayCollection и так далее. Он содержит одно свойство для AdvisedClient и одно для NotAdvisedClient.
Сгенерированный класс довольно сложный, но я постараюсь упростить его:
public class _Super_ClientsModel extends flash.events.EventDispatcher implements com.adobe.fiber.valueobjects.IValueObject {
private var _internal_client : com.company.product.clients.valueObjects.Client;
private var _internal_advisedClient : com.company.product.clients.valueObjects.AdvisedClient;
private var _internal_notAdvisedClient : com.company.product.clients.valueObjects.NotAdvisedClient;
}
Функции get возвращают их соответственно.
Итак, вы видите, что сгенерированный класс не такой, как я ожидал, и с этим я не могу работать.
Если вы думаете, что весь класс здесь уместен, я тоже могу прикрепить его ...
Еще раз спасибо,
Daniel