CXF -> Probleme mit xsd:any?

Sadik

Mitglied
Webservice / CXF --> XML-Elemente werden beim Unmarshallen nicht erkannt

Ich wiedermal. :)

Irgendwie gibt mir mein gebauter CXF-Webservice seltsame Nachrichten zurück.
Laut WSDL gibt es folgende Konstellation:

PHP:
<s:element name="GetPacketDetailsById"> 
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="PacketAdressAndReceipientByPacketId">
              <s:complexType mixed="true">
                <s:sequence>
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>

An der Stelle des xsd:any-Elements folgen dann in der Regel 2-3 Anfragesätze. Wenn ich so eine Datei allerdings (mit dem mit der WSDL gelieferten Client wohlgemerkt, ergo geh ich davon aus das der Anfragesatz korrekt ist) gegen meinen Webservice feuer bleibt davon nur folgendes über:

Eine Instanz der Klasse GetPacketDetailsById mit der inneren statischen Klasse PacketAdressAndReceipientByPacketId. Diese Klasse enthällt dann eine ArrayList mit diesen beiden Inhalten: ein Element vom Typ org.apache.xerces.dom.ElementNSImpl und ein Element vom Typ String. Als Konsolenausgabe bleibt dieser Satz bestehen: [PacketAdressAndReceipientByPacketId: null].

Das ganze ist mir ein bißchen schleierhaft, aber ich führe es entweder darauf zurück, dass der xsd:any Type nicht korrekt umgesetzt wird oder CXF die weiteren Schemadateien (und die generierten Klassen) ignoriert. Muß bzw kann ich diese dem Unmarshaller mit bekanntgeben? Oder liegt das Problem an anderer Stelle?
 
Zuletzt bearbeitet:
Ok ich hab ein bissel weiter gedebuggt, und auch mal geschaut ob das ggf an der CXF-Version lag, allerdings hab ich keinen Unterschied zwischen 2.0.4 bis 2.0.7-Snapshot, also denk ich mal das is allgemein bei mir falsch.

Das besagte ElementNSImpl-Objekt hat tatsächlich einen Vektor mit meinen XML-Daten drin..ankommen tut das also, aber warum wird das nicht in mein Objekt ungemarshallt? Bleibt die Frage..kennt CXF meine Klassen einfach nicht?
 
Ok mein letzter Stand:

Der Webservice funktioniert soweit tadelos, derzeit auf CXF Version 2.1 auf Jetty 6.1.7. Zumindest die ersten beiden Elemente weit.

PHP:
<s:element name="GetPacketDetailsById"> 
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="PacketAdressAndReceipientByPacketId">
              <s:complexType mixed="true">
                <s:sequence>
                  <s:any />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>

Das ganze erzeugt mir nach der Codegenerierung diesen Schnipsel:

PHP:
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "content"
    })
    public static class PacketAdressAndReceipientByPacketId {

        @XmlMixed
        @XmlAnyElement(lax = true)
        protected List<Object> content;

        public List<Object> getContent() {
            if (content == null) {
                content = new ArrayList<Object>();
            }
            return this.content;
        }

In meiner Implementierung bekomm ich ein Objekt des Typs GetPacketDetailsById.PacketAdressAndReceipientByPacketId zurück. Darauf kann ich zugreifen. Es enthällt ein Element des Typs com.sun.org.apache.xerces.internal.dom.ElementNSImpl in einer ArrayList. Wenn man beim debuggen ein wenig in dieses Objekt hineinschnüffelt kommt man auch an die vom Client übergebenen XML-Daten in Vectorform, sie werden nur nicht richtig mit geunmarshalt. Da die wsdl und dem XML-Schema einen Bruch haben (besagtes xsd:any Objekt in der wsdl) gehe ich davon aus, dass CXF diese Daten nicht zuordnen kann und demnach einfach nicht unmarshallt.

Bisher habe ich allerdings keine Lösung gefunden, wie ich diesen Fehler beheben kann, bzw geht es an mir vorbei, wie ich das ohne Eingriffe in die WSDL beheben kann..hat jemand einen Ratschlag?
 
Zurück