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似乎都很好。
答案 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
,但解码器不会设置Race
和Sound
。
请注意,解码器将正确设置HouseTrained
- 属性,因为当它遇到基类中的缺失标记时,它会在那里停止解码并继续使用Dog
类的其余部分。 / p>