2012-03-19 169 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