WSDL wygląda tak:

<xsd:element name="Parent">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" ref="tns:Child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Spodziewane zachowanie

Jeśli pozwolę Axis 1.4 generować kod Java na podstawie WSDL, oczekuję w moim obiekcie następującego pola:

public class MyComplexObject {
    private Parent parent;
}

Klasa Parent składałaby się z tablicy Child obiektów.

public class Parent {
    private Child[] child;
}

Rzeczywiste zachowanie

Rzeczywiste zachowanie polega na tym, że lista obiektów Child jest definiowana bezpośrednio na poziomie obiektu nadrzędnego:

public class MyComplexObject {
    private Child[] parent;
}

Kiedy wywołamy usługę internetową, wypełniając tablicę, otrzymamy następujący kod XML:

<Parent>
    ...
</Parent>
<Parent>
    ...
</Parent>

Powodowanie awarii po stronie serwera. Wygląda na to, że Axis ma problemy z zagnieżdżonymi tablicami typów złożonych. Czy ktoś ma ten sam problem i zna jakieś obejście/poprawkę?

Wyniki

Po pewnym śledztwie udało mi się uzyskać oczekiwane zachowanie, dodając do definicji XSD pole atrapy:

<xsd:element name="Parent">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="Dummy" type="xsd:string"/>
            <xsd:element maxOccurs="unbounded" ref="tns:Child"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

Wygląda na to, że w tym przypadku Axis poprawnie tworzy obiekt opakowujący Parent:

public class Parent {
    private String dummy;
    private Child[] child;
}

A moje wyjście XML jest poprawne:

<Parent>
    <Dummy>...</Dummy>
    <Child>...</Child>
    <Child>...</Child>
</Parent>

Wygląda więc na to, że jest to naprawdę błąd w osi 1.4...

4
p.mesotten 20 luty 2012, 14:38

2 odpowiedzi

Najlepsza odpowiedź

Niedawno znalazłem na to rozwiązanie. wsdl2java wydaje się mieć nieudokumentowaną opcję -w, która jest skrótem dla --wrapArrays. Jeśli generujesz swoje zajęcia za pomocą SoapUI, możesz wybrać tę opcję:

SoapUI and wsdl2java

Jak wspomniano, ta opcja utworzy klasy dla „pewnych wzorców tablic schematów”, takich jak wzorzec przedstawiony w moim pytaniu.

Jeśli używasz Eclipse do generowania klienta usługi sieciowej, możesz skonfigurować ten sam rodzaj opcji, przechodząc do Axis Emitter w Preferencjach Eclipse i zaznaczając odpowiednie pole wyboru.

Eclipse and wsdl2java

5
p.mesotten 6 marzec 2012, 16:19

Czy próbowałeś użyć opcji -W w poleceniu wsdl2java?

Z Informacji o narzędziach:

-W, --noWrapped Wyłącza to specjalne traktowanie tak zwanych operacji „opakowanych” na dokumentach/dosłownych stylach. Domyślnie WSDL2Java będzie rozpoznać następujące warunki:

  • Jeśli wiadomość wejściowa ma to pojedyncza część.
  • Część jest elementem.
  • Element ma taką samą nazwę jak operacja
  • Typ złożony elementu nie ma atrybutów

    Kiedy to zobaczy, WSDL2Java „rozpakuje” element najwyższego poziomu i potraktuje każdy ze składników elementu jako argumenty operacja. Ten typ WSDL jest domyślny dla Microsoft .NET web usługi, które zawierają argumenty stylu RPC w tym schemacie najwyższego poziomu element.

Może to mogłoby to naprawić.

1
Tomas Narros 21 luty 2012, 15:21