2011-07-04 15 views
1

一般的な情報をFlexクライアントからWSDLを消費:継承型で

  • 私は、私はGlassFishの3.1を経由してJAX-WS 2.2を(使用してWSDLを生成FlashBuilder 4
  • を使用するFlex 4.5
  • を使用AS)

クライアントのリストを返すWebサービスが必要です。 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です。

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

(ここで私はすべての3つのクラスを注釈付き@XmlRootElementを使用してClientsModelに@XmlRootElementを注釈付けし、ClientsModel.getClients()に@XmlElementRefを注釈付けし、さらにClientsModelに@XmlSeeAlsoという注釈を付けて、JAXBContextがAdvisedClientクラスとNotAdvisedClientクラス)。

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

(ここで私は@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> 

をそして私は、ウィザードのWebサービスに接続する "FlashBuilderのを使用する場合、私はadvisedClientのプロパティが含まれているClientsModelクラスを持って、 notAddedClientの別のものですが、リストではありません!

は、その後、私は第二のアプローチを試みたが、次のスキーマました:クライアントのためのcomplexTypeのに対し

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

を、AdvisedClientとNotAdvisedClientは同じまま。

はFlashBuilderを使用してActionScriptでクラスを生成した後、私はこの時間は

は、JAXBを使用してスキーマを制御する別の方法がある...ないAdvisedClientまたはNotAdvisedClientで、唯一のClientクラスバインドさだように継承


お返事ありがとうございます。

残念ながら、AS生成クラスについて詳しくはありません。 私はリストを意味しませんでした。私は、生成されたClientsModelクラスにList/array/ArrayCollectionなどが含まれていないということを意味していました。 AdvisedClientには単一のプロパティが、NotAdachedClientには単一のプロパティが含まれます。

生成されたクラスは非常に複雑ですが、私はそれを簡素化しようとします:

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関数は、それぞれそれらを返します。

これで、生成されたクラスが期待通りではないことがわかりました。それは私が扱えるものではありません。あなたはクラス全体がここに関連すると思われる場合 は、私はFlexでListは、UI要素である、

おかげで再び...あまりにも ダニエル

答えて

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! 

それを添付することができ、そしてそれは通常使用されていませんリモートサービスとの間で情報をやりとりするためのデータ型として使用します。私は、Flash Builderが "List"データ型を持つものを生成するために自動的に生成するモデルスタイルオブジェクトは何も期待していません。 ArrayまたはArrayCollectionを使用する可能性が高くなります。

ただし、生成されたAS3オブジェクトは表示されませんでした。あなたが彼らが何のように生成されたのかを指定していませんでした。だからどこに向かうのかわからない。