Come posso gestire Castor unmarshaling dei messaggi SOAP quando lo spazio dei nomi è definito all'interno del tag dell'operazione?
-
06-07-2019 - |
Domanda
Sto sviluppando un servizio web primo contratto basato su Spring-WS. Mi affido a Castor Marshaling e ho riscontrato il seguente problema.
Le richieste vengono accettate quando " xmlns " lo spazio dei nomi è definito nel tag Envelope, ad esempio:
<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>
Tuttavia, entrambi i client .NET e Java generati dal .wsdl fornito da Spring-WS (che è stato generato da un XSD), formano le loro richieste nel modo seguente:
<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>
Il che si traduce in un'eccezione Unmarshalling generata da Castor. Come faccio a convincere Castor a riconoscere questi messaggi come validi? Il mio WSDL (o l'XSD che ho usato per generarlo automaticamente) potrebbe essere sbagliato?
Soluzione
SE vedi questo blog penso che non andrò mai ad altri servizi web :) http://springkbase.blogspot.com/2009/06/ primavera-webservice-con-castor.html
Altri suggerimenti
Ho riscontrato questo problema più e più volte con il mio primo servizio web Spring-WS / Castor. Per quanto ne so, da qualche parte lungo la linea qualche componente estrae il payload in un modo non compatibile con lo spazio dei nomi. In altre parole, un nodo come doPlaceHoldRequest diventa la radice di un documento XML senza ereditare la dichiarazione dello spazio dei nomi di livello superiore e, nei due casi precedenti, che porta a uno che è nello spazio dei nomi desiderato, e uno che non lo è - quindi uno convalida bene contro il tuo schema e l'altro no.
La soluzione migliore sembra essere quella di coprire tutte le basi. Rendi il tuo XSD avere elementFormDefault = "qualificato", per richiedere che tutti i tuoi elementi siano in uno spazio dei nomi. Quindi specifica un ns-uri e un ns-prefix in ogni elemento map-to nel tuo castor mapping. Il risultato è un po 'più pesante, con tutti i prefissi dello spazio dei nomi, ma sembra renderlo molto meno fragile quando si tratta di client pigri e comportamento non documentato nei componenti del server.
JAX-WS restituisce elenchi vuoti fa un buon punto, pure. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor
vale la pena dover convalidare ciò che entra e esce.