Como posso lidar com Castor unmarshaling de mensagens SOAP quando o namespace é definido dentro da tag operação?
-
06-07-2019 - |
Pergunta
Estou desenvolvendo um serviço web contrato de primeiro baseado em Spring-WS. Eu estou contando com Castor empacotamento, e eu tenho que correr para o seguinte problema.
Os pedidos estão sendo aceitas quando os "xmlns" namespace é definido na tag Envelope, tais como:
<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>
No entanto, tanto NET e clientes Java gerados a partir do .WSDL proporcionada pela mola-WS (que foi gerada a partir de um XSD), formam os seus pedidos da seguinte maneira:
<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>
o que resulta em uma exceção unmarshalling sendo jogado por Castor. Como faço para obter Castor de reconhecer essas mensagens como válida? Poderia meu WSDL (ou o XSD que eu usei para gerar automaticamente ele) estar errado?
Solução
Se você vê este blog eu acho que nunca mais vou para outros webservices :) http://springkbase.blogspot.com/2009/06/ spring-webservice-com-castor.html
Outras dicas
Eu corri para este problema e outra vez com o meu primeiro serviço web Spring-WS / Castor. Tanto quanto eu posso dizer, em algum lugar ao longo da linha alguns extratos componentes da carga de uma forma não-namespace ciente. Em outras palavras, um nó como doPlaceHoldRequest torna-se a raiz de um documento XML sem herdar a declaração de namespace de nível superior, e nos dois casos acima, que leva a um que é no namespace que você quer, e um que não é - assim a valida fino para o seu esquema, e o outro não
.A melhor solução parece ser a de cobrir todas as bases. Faça o seu XSD tem elementFormDefault = "qualificado", para exigir que todos os seus elementos para estar em um namespace. Em seguida, especifique um ns-uri e um ns-prefixo em cada mapa-to elemento em seu mapeamento Castor. O resultado é um pouco mais pesado, com todos os prefixos de namespace, mas parece torná-lo muito menos frágil quando se trata de clientes preguiçosos e comportamento não documentada em componentes do servidor.
JAX-WS retornar listas vazias faz um ponto bom, também. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor
vale a pena ter para validar o que entra e sai.