Wie kann ich umgehen Castor Unmarshalling von SOAP-Nachrichten, wenn der Namensraum innerhalb des Betriebs-Tag definiert ist?

StackOverflow https://stackoverflow.com/questions/626648

Frage

Ich entwickle einen vertrags ersten Web-Service basierend auf Frühling-WS. Ich verlasse mich auf Castor-Marshalling, und ich habe in der folgenden Ausgabe führen.

Anfragen akzeptiert werden, wenn die „xmlns“ Namespace im Envelope-Tag definiert ist, wie zum Beispiel:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                      xmlns="http://www.mycompany.com/MyService/schemas">
  <soap:Header/>
  <soap:Body>
    <doPlaceHoldRequest>
      <hold>
        <accountInfo>
          <accountNumber>123456789</accountNumber>
        </accountInfo>
        <extended>false</extended>
        <afterHours>false</afterHours>
        <amountSavings>1.00</amountSavings>
        <amountChecking>0.00</amountChecking>
      </hold>
    </doPlaceHoldRequest>
  </soap:Body>
</soap:Envelope>

Doch sowohl .NET- und Java-Clients aus dem .wsdl erzeugt bereitgestellt von Spring-WS (die von einem XSD generiert wurden), ihre Anträge auf folgende Weise bilden:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header/>
  <soap:Body>
    <doPlaceHoldRequest 
                xmlns="http://www.mycompany.com/MyService/schemas">
      <hold>
        <accountInfo>
          <accountNumber>123456789</accountNumber>
        </accountInfo>
        <extended>false</extended>
        <afterHours>false</afterHours>
        <amountSavings>1.00</amountSavings>
        <amountChecking>0.00</amountChecking>
      </hold>
    </doPlaceHoldRequest>
  </soap:Body>
</soap:Envelope>

, die in einer Unmarshalling Ausnahme dazu führt, dass durch Castor geworfen. Wie erhalte ich Castor diese Nachrichten als gültig anzuerkennen? Könnte mein WSDL (oder die XSD habe ich es automatisch generieren) falsch sein?

War es hilfreich?

Lösung

Wenn u dieses Blog sehen Ich denke nie an andere Web Service gehen :) http://springkbase.blogspot.com/2009/06/ Feder-WebService-mit-castor.html

Andere Tipps

Ich lief in dieses Problem immer und immer wieder mit meinem ersten Frühling-WS / Castor Webservice. Soweit ich das beurteilen kann, irgendwo entlang der Linie extrahiert eine Komponente die Nutzlast in einer nicht-Namespace-aware Art und Weise. Mit anderen Worten, ein Knoten wie doPlaceHoldRequest die Wurzel eines XML-Dokuments wird ohne die Top-Level-Namespace-Deklaration zu vererben, und in den beiden oben genannten Fällen, das führt zu einer, die ist im Namensraum Sie wollen, und eine, die nicht - so ein bestätigt Bußgeld gegen das Schema, und der andere nicht

.

Die beste Lösung scheint alle Basen zu decken zu sein. Machen Sie Ihre XSD haben ElementFormDefault- = „qualifiziert“, zu verlangen, alle Elemente in einem Namensraum zu sein. Dann geben Sie einen ns-uri und einen ns-Präfix in jeder Karte-zu-Elemente in Ihrem Castor-Mapping. Das Ergebnis ist ein wenig schwerer, mit allen Namespacepräfixe, aber es scheint es weniger zerbrechlich viel zu machen, wenn es darum geht, zu faul Kunden und undokumentierte Verhalten in Serverkomponenten.

JAX-WS zurückkehren leere Listen einen guten Punkt macht, zu. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor ist wert, zu validieren, was kommt und aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top