¿Cómo puedo manejar la desorganización de mensajes SOAP de Castor cuando el espacio de nombres está definido dentro de la etiqueta de operación?

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

Pregunta

Estoy desarrollando un servicio web de primer contrato basado en Spring-WS. Estoy confiando en la clasificación de Castor, y me he encontrado con el siguiente problema.

Las solicitudes se aceptan cuando el " xmlns " el espacio de nombres se define en la etiqueta Envelope, 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>

Sin embargo, los clientes .NET y Java generados a partir del .wsdl proporcionado por Spring-WS (que se generó a partir de un XSD), forman sus solicitudes de la siguiente manera:

<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>

Lo que da como resultado que Castor arroje una excepción de desorden. ¿Cómo hago para que Castor reconozca estos mensajes como válidos? ¿Podría mi WSDL (o el XSD que usé para autogenerarlo) estar equivocado?

¿Fue útil?

Solución

SI ves este blog, creo que nunca iré a otros servicios web :) http://springkbase.blogspot.com/2009/06/ spring-webservice-with-castor.html

Otros consejos

Me encontré con este problema una y otra vez con mi primer servicio web Spring-WS / Castor. Por lo que puedo decir, en algún lugar a lo largo de la línea, algunos componentes extraen la carga útil de una manera no consciente del espacio de nombres. En otras palabras, un nodo como doPlaceHoldRequest se convierte en la raíz de un documento XML sin heredar la declaración de espacio de nombres de nivel superior, y en los dos casos anteriores, eso lleva a uno que está en el espacio de nombres que desea, y uno que no lo es, por lo que uno valida bien según su esquema y el otro no.

La mejor solución parece ser cubrir todas las bases. Haga que su XSD tenga elementFormDefault = " calificado " ;, para requerir que todos sus elementos estén en un espacio de nombres. Luego, especifique un ns-uri y un ns-prefix en cada elemento map-to en su asignación Castor. El resultado es un poco más pesado, con todos los prefijos de espacio de nombres, pero parece hacerlo mucho menos frágil cuando se trata de clientes perezosos y comportamiento indocumentado en componentes del servidor.

JAX-WS devuelve listas vacías hace un buen punto, también. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor vale la pena tener que validar lo que entra y sale.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top