Come posso gestire Castor unmarshaling dei messaggi SOAP quando lo spazio dei nomi è definito all'interno del tag dell'operazione?

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top