Como posso lidar com Castor unmarshaling de mensagens SOAP quando o namespace é definido dentro da tag operação?

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

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top