2012-03-19 72 views
1

我有兩個Flex(4.6)SoapDecoder的主要問題,我真的無法擺脫困境。Flex:肥皂解碼出錯

第一個主要問題是我的ArrayCollection被解碼並插入屬性的第一項,而不是屬性的值。

所以我最終喜歡

valueObject 
|- children():ArrayCollection 
    |- [0] ArrayCollection 
       |- [0] SomeObject 
       |- [1] SomeObject 
       ... 

,而不是結構的預期

valueObject 
|- children():ArrayCollection 
    |- [0] SomeObject 
    |- [1] SomeObject 
    ... 

我有,這是一個奇怪的,第二個主要問題是,一些對象不要讓他們的價值觀,而其他人。

例如。酒吧對象有2個屬性有2個對象 酒吧 - ()foo的:美孚 - )tappas(:Tappas

富得到它的價值完全而tappas保持爲空。 兩個對象在WSDL中聲明,並在SchemaTypeRegistry這樣註冊:

SchemaTypeRegistry.getInstance().registerClass(new QName("http://test.com/service","tappas"),Tappas); 
SchemaTypeRegistry.getInstance().registerClass(new QName("http://test.com/service","foo"),Foo); 

我了2天已經試圖讓我解決這個問題的頭,我無法找到一個體面explination。 我的代碼(我正在使用SDK Webservice)作爲WSDL對我來說似乎很好。

回答

0

我找到了。 我的理論是,當Flex Soap解碼器擊中他不期望的元素時,它會跳過整個定義並繼續前進。 看來,解碼器開始解碼基類並從那裏向上移動。 當元素與WSDL中的期望元素不匹配時,例如,由於響應中缺少標記,SOAP解碼器跳過解碼其餘部分,並繼續處理它最初處理的類。

例如: WSDL:

<s:complexType name="Animal"> 
    <s:sequence> 
     <s:element name="Name" type="s:string" /> 
     <s:element name="Race" type="s:string" /> 
     <s:element name="Sound" type="s:string" /> 
    </s:sequence> 
</s:complexType> 

<s:complexType name="Dog"> 
    <s:complexContent> 
     <s:extension base="s0:Animal"> 
      <s:sequence> 
       <s:element name="HouseTrained" type="s:boolean" /> 
      </s:sequence> 
     </s:extension> 
    </s:complexContent> 
</s:complexType> 

如果你的迴應是這樣的:

<Animal xmlns:s01="http://www.world.com/AnimalKingDom" xsi:type="s01:Dog"> 
    <Name>Snowy</Name> 
    <Sound>Barking</Sound> 
    <HouseTrained>true</HouseTrained> 
</Animal> 

酒店Name將要設置正確,但RaceSound不會已經被解碼器設置。 請注意,HouseTrained屬性將由解碼器正確設置,因爲當它運行到基類中的缺失標記時,它將停止解碼,並繼續執行類的其餘部分。

+0

動物:狗。聲音:barfing ... rofl – 2012-03-20 15:15:37