Hola, creo un código para consumir el servicio SOAP,
Para el encabezado de autenticación, utilicé Wss4jSecurityInterceptor para establecer la información del encabezado.
Recibo una respuesta fallida como la siguiente
Exception in thread "main" org.springframework.ws.soap.client.SoapFaultClientException: Required element {http://www.w3.org/2005/08/addressing}Action is missingMi código de configuración como se muestra a continuación
@Configuration public class SoapClientConfig { @Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setContextPath("com.xyz.client"); marshaller.setCheckForXmlRootElement(false); return marshaller; } @Bean public MyClient myClient(Jaxb2Marshaller marshaller) throws Exception { MyClient client = new MyClient(); client.setDefaultUri("https://localhost:8080/ws/service"); client.setMarshaller(marshaller); client.setUnmarshaller(marshaller); ClientInterceptor[] interceptors = new ClientInterceptor[] {securityInterceptor()}; client.setInterceptors(interceptors); return client; } @Bean public Wss4jSecurityInterceptor securityInterceptor() { Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor(); wss4jSecurityInterceptor.setSecurementActions("UsernameToken"); wss4jSecurityInterceptor.setSecurementMustUnderstand(true); wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText"); wss4jSecurityInterceptor.setSecurementUsername("XXXXXXXXXXX"); wss4jSecurityInterceptor.setSecurementPassword("XXXXXXXX"); return wss4jSecurityInterceptor; } }¿Alguien puede sugerirme lo que me estoy perdiendo?
Si lo intento desde SOAPUI, funciona bien. Si configuro WS-Addressing=false desde SOAPUI y también me da el mismo error, entonces emita con la propiedad WS-Addressing establecida con el código anterior. ¿Cómo puedo?
¿Utiliza WebServiceTemplate para enviar la solicitud? Si es así, puedes hacer algo como:
ActionCallback callback = new ActionCallback( new URI("action uri"));Aquí debe proporcionar la ubicación de acción de uri real en lugar de "uri de acción". Entonces hazlo
getWebServiceTemplate().marshalSendAndReceive(request, callback)Mucho tiempo antes trabajé en llenar el encabezado SOAP con valor dinámico, para eso necesita trabajar en la construcción de los nodos xml usando el objeto de devolución de llamada ... WebServiceMessageCallback
http://docs.spring.io/spring-ws/site/reference/html/client.html#d5e1848
En mi escenario, necesito construir el nodo usando QName (Java) Node by Node.