Flex:Soap Decoding出错了

时间:2012-03-19 14:23:51

标签: flex soap flex4 wsdl flex4.5

Flex(4.6)SoapDecoder有2个主要问题,我真的无法理解。

第一个主要问题是我的ArrayCollection被解码并插入属性的第一项而不是属性的值。

所以我最终得到了像

这样的结构
valueObject
 |- children():ArrayCollection
    |- [0]    ArrayCollection
              |- [0] SomeObject
              |- [1] SomeObject
                 ...

而不是预期的

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

我遇到的第二个主要问题,就是奇怪的问题,就是某些对象没有分配其他值,而其他对象则是。

例如。 Bar对象有2个属性,包含2个对象     酒吧       - foo():Foo       - tappas():Tappas

foo在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);

我花了两天时间试图解决这个问题,我找不到合适的探索。 我的代码(我使用SDK Webservice)作为WSDL似乎都很好。

1 个答案:

答案 0 :(得分: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 - 属性,因为当它遇到基类中的缺失标记时,它会在那里停止解码并继续使用Dog类的其余部分。 / p>