2012-04-23 16 views
6

Estoy intentando crear un mensaje SOAP simple para enviar desde un cliente, pero aparentemente no puedo cambiar el URI del espacio de nombres "jabón" en el sobre.No se puede cambiar el URI de jabón en un sobre usando Java SoapMessage

Esto es lo que el encabezado de jabón debe ser similar:

<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> ... </soap:Envelope> 

Así que el siguiente código:

final SOAPMessage sm = MessageFactory.newInstance().createMessage(); 

    final SOAPPart sp = sm.getSOAPPart(); 
    final SOAPEnvelope se = sp.getEnvelope(); 
    final SOAPHeader sh = se.getHeader(); 
    final SOAPBody sb = se.getBody(); 

    se.removeNamespaceDeclaration(se.getPrefix()); 
    se.addNamespaceDeclaration("soap", "http://www.w3.org/2001/12/soap-envelope"); 
    se.setPrefix("soap"); 
    sb.setPrefix("soap"); 
    sh.setPrefix("soap"); 
    se.setEncodingStyle("http://www.w3.org/2001/12/soap-encoding/"); 

Sin embargo, al imprimir el mensaje antes de enviarlo, lo que sigue es mi sobre :

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> 

Observe las diferencias en los URI de xmlns: soap en la sección "debería ser" y el real.

Si cambio el primer argumento de la llamada a addNamespaceDeclaration "jabonosa" en lugar de "jabón", esto es la siguiente dotación consigo:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapy="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding/"> 

supongo que puede tener algo que ver con el hecho de que la llamada es addNamespaceDeclaration en lugar de algo como changeNamespaceDeclaration, y se ignora teniendo en cuenta que el espacio de nombres ya está presente, pero no puedo encontrar algo que funcione (ya lo intenté setAttributeNS).

EDIT: Me acabo de dar cuenta de que setAttributeNS es tonto porque eso está cambiando el espacio de nombres, no el URI. EDITAR DE NUEVO: Estoy un poco confundido, mientras sigo buscando Veo a veces que el nombre va soap:"Namespace", así que en ese sentido quiero cambiar el espacio de nombres ... pero pensé que el espacio de nombres era la parte "jabón" . ¿Alguna aclaración?

Esta es mi primera publicación, así que me disculpo si estoy pidiendo algo que ya se ha resuelto, pero he buscado y la mayoría de lo que he encontrado está relacionado con cambiar el espacio de nombres (como SOAP-ENV , que es el espacio de nombres predeterminado, a jabón) en lugar de la URI en sí. Gracias por adelantado.

-M

Respuesta

13

En general no debería ser necesario modificar manualmente el espacio de nombres SOAP. Lo que probablemente quiera lograr es crear un mensaje SOAP 1.2 (que tiene un espacio de nombres diferente de SOAP 1.1). Prueba quitando todas las líneas de espacio de nombres de alteración de su código y cambiar la primera línea de

final SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); 

En caso de que realmente necesita para especificar qué prefijo que se debe utilizar, este código parece funcionar:

SOAPMessage sm = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL).createMessage(); 
sm.getSOAPPart().getEnvelope().setPrefix("soap"); 
sm.getSOAPPart().getEnvelope().removeNamespaceDeclaration("env"); 
sm.getSOAPHeader().setPrefix("soap"); 
sm.getSOAPBody().setPrefix("soap"); 
+1

Gracias por la respuesta rápida erik, sin embargo lo intenté unos 5 minutos antes de su publicación y vi que el espacio de nombre predeterminado había cambiado de "SOAP-ENV" (que había cambiado a "jabón") a "env": ' \t ... ' Realmente necesito el sobre para que coincida con lo que había publicado originalmente, ¿alguna otra sugerencia? Tal vez solo necesito compilar el mensaje, ya que parece que los dos protocolos soportados por MessageFactory no son del todo correctos ... – MandM

+1

El prefijo (ej. 'Env' o' soap') no tiene ningún significado semántico, es solo un atajo para referenciar el espacio de nombres (por ejemplo, 'http: // www.w3.org/2003/05/soap-envelope'). – erikxiv

+0

Es bueno saber, sin embargo, creo que el dispositivo con el que me estoy comunicando requiere que esos campos sean de esa manera en la solicitud (creo). – MandM

Cuestiones relacionadas