tutorial services jax from example consume java web-services jax-ws

java - services - Seguimiento de solicitudes/respuestas de SOAP con JAX-WS en el lado del cliente



soap web service java (3)

Estoy usando la implementación de referencia JAX-WS (2.1.7) y quiero rastrear solicitudes / respuestas SOAP en el lado del cliente . En realidad, lo que necesito es examinar algunos encabezados Http cuando recibo la respuesta.

Siguiendo estas preguntas previas ( Seguimiento de solicitudes / respuestas XML con JAX-WS y Java JAX-WS cliente del servicio web: ¿cómo solicitar y responder xml? ), He creado mi propio controlador para iniciar sesión cuando envío una solicitud y recibo un respuesta:

public class SHandler implements SOAPHandler<SOAPMessageContext> { private static final Logger log = Logger.getLogger(SHandler.class); @Nullable @Override public Set<QName> getHeaders() { log.debug(">>>>>>>>>>> GetHeaders"); return null; } @Override public boolean handleMessage(SOAPMessageContext soapMessageContext) { log.debug(">>>>>>>>>>> HandleMessage"); return true; } @Override public boolean handleFault(SOAPMessageContext soapMessageContext) { log.debug(">>>>>>>>>>> HandleFault"); return true; } @Override public void close(MessageContext messageContext) { log.debug(">>>>>>>>>>> Close"); } }

y agrego el controlador a la cadena de controladores durante la inicialización del servicio:

@WebServiceClient(name = "MyService", targetNamespace = "http://www.whatever.com/", wsdlLocation = "file:/path/to/wsdl") public class MyService extends Service { public MyService(URL wsdlLocation) { super(...); initializeBinding(); } @WebEndpoint(name = "MyOperation") public MyPort getMyPort() { return super.getPort(new QName("http://www.whatever.com/", "MyPort"), MyPort.class); } private void initializeBinding() { MyPort port = getMyPort(); BindingProvider bindingProvider = ((BindingProvider) port); List handlerChain = bindingProvider.getBinding().getHandlerChain(); handlerChain.add(new SHandler()); bindingProvider.getBinding().setHandlerChain(handlerChain); } ... }

El problema es que esto no funciona en absoluto en el lado del cliente. No veo ningún registro y mi controlador nunca se ejecuta cuando envío una solicitud y recibo una respuesta.

Tenga en cuenta que no hay un WSDL específico relacionado con este problema porque trabajo en una plataforma MDA que genera artefactos cliente / servidor de cualquier WSDL. Además, no puedo hacer esto en el nivel de configuración, ya que todo se genera, así que solo puedo hacerlo mediante programación (he estado buscando en Google y todas las soluciones que encuentro son la que está en la publicación original o la cadena de controladores) archivo de configuración .xml).

¿Me estoy perdiendo de algo? ¿Hay otra manera de hacer esto?

Gracias por adelantado.


¿Por qué no utilizar la @HandlerChain(file = "....") ?

Desde mi punto de vista, no puede mezclar las configuraciones basadas en anotaciones y constructores como la inicialización del servicio web en implementación y la creación de una nueva instancia de su clase de servicio se realiza en contextos absolutamente diferentes.


Si solo desea ver los mensajes SOAP ejecutados con

-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true

Argumento VM


hay 2 herramientas que puede usar para ayudar con esto:

Ambas herramientas ofrecen un modo proxy, que intercepta, registra y reenvía solicitudes y respuestas.