从具有继承类型的Flex客户端使用WSDL

时间:2011-07-04 14:09:06

标签: flex web-services inheritance actionscript jaxb

一般信息:

  • 我使用Flex 4.5
  • 我使用FlashBuilder 4
  • 我使用JAX-WS 2.2(通过GlassFish 3.1 AS)生成WSDL

我想要一个返回客户列表的Web服务。 在Java代码中,我有一个Client的基类和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。

Web服务如下所示:

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

(这里我使用@XmlRootElement注释了所有3个类,我还使用@XmlRootElement注释了ClientsModel,使用@XmlElementRef注释了ClientsModel.getClients(),还注释了带有@XmlSeeAlso的ClientsModel,以便JAXBContext可以识别AdvisedClient和NotAdvisedClient类)。

http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-using-xsitype.html

(这里我只注释了带有@XmlRootElement的Client类,并按原样保留了扩展类,并删除了@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的“连接到Web服务”向导时,我得到了一个ClientsModel类,其中包含了adviceClient的属性和另一个用于notAdvisedClient的属性,但不是列表!

然后我尝试了第二种方法,并获得了以下架构:

<xs:complexType name="ClientsModel">
  <xs:sequence>
    <xs:element name="clients" type="tns:Client" nillable="true" minOccurs="0" maxOccurs="unbounded" />
   </xs:sequence>
</xs:complexType>

而Client,AdvisedClient和NotAdvisedClient的complexType保持不变。

使用FlashBuilder在ActionScript中生成类之后,我这次只有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函数分别返回它们。

所以你看到生成的类并不像我期望的那样,而且我无法使用它。 如果你认为全班都是相关的,我也可以附上它......

再次感谢, 丹尼尔

1 个答案:

答案 0 :(得分:0)

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!

Flex中的List是一个UI元素,它通常不用作向远程服务传递信息和从远程服务传递信息的数据类型。我不希望Flash Builder自动生成任何模型样式对象来生成具有“List”数据类型的任何内容。它更可能使用Array或ArrayCollection。

但是,您没有显示生成的AS3对象;你也没有具体说明它们的生成情况;所以我不确定下一步指导你的地方。