Использование WSDL от клиента Flex с типами наследования - PullRequest
1 голос
/ 04 июля 2011

Общая информация:

  • Я использую 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

1 Ответ

0 голосов
/ 04 июля 2011
when I used FlashBuilder's 'Connect to Web Service' wizard, I got a ClientsModel class which contains a property for advisedClient and another for notAdvisedClient, but NOT as lists!

A Список в Flex - это элемент пользовательского интерфейса, который обычно не используется в качестве типа данных для передачи информации в удаленную службу и из нее.Я не ожидал бы, что объекты стиля модели, которые Flash Builder автоматически генерирует, генерируют что-либо с типом данных «Список».Скорее будет использовать Array или ArrayCollection.

Но вы не показали сгенерированные объекты AS3;и вы не указали, что они генерируются как;поэтому я не уверен, куда направить вас дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...