Wie kann ich umgehen Castor Unmarshalling von SOAP-Nachrichten, wenn der Namensraum innerhalb des Betriebs-Tag definiert ist?
-
06-07-2019 - |
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?
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.