Flex: декодирование мыла идет не так - PullRequest
1 голос
/ 19 марта 2012

У меня есть 2 основные проблемы с SoapDecoder Flex (4.6), я действительно не могу разобраться.

Первая большая проблема заключается в том, что моя ArrayCollection декодируется и вставляется в первый элементсвойство вместо того, чтобы быть значением свойства.

Таким образом, я получаю структуру типа

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

вместо ожидаемого

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

Вторая серьезная проблемаУ меня есть, и это странно, что некоторые объекты не получают свои значения, в то время как другие.

например.у объекта Bar есть 2 свойства с 2 объектами Bar - 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);

Я потратил 2 дня, пытаясь решить эту проблему, и не могу найти подходящего объяснения.Оба моих кода (я использую SDK Webservice) в качестве WSDL кажутся мне подходящими.

1 Ответ

0 голосов
/ 20 марта 2012

Я нашел это.Моя теория заключается в том, что когда декодер 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.

...