¿Existe una manera fácil (también conocida como: no usar un proxy) para obtener acceso al XML de solicitud / respuesta sin procesar para un servicio web publicado con la implementación de referencia JAX-WS (la que se incluye en JDK 1.5 y superior)? Poder hacer eso a través del código es lo que necesito hacer. Solo tener que iniciar sesión en un archivo mediante configuraciones de registro inteligentes sería bueno pero suficiente.
Sé que existen otros marcos más complejos y completos que podrían hacer eso, pero me gustaría mantenerlo lo más simple posible y axis, cxf, etc., todos agregan una sobrecarga considerable que quiero evitar.
¡Gracias!
java
web-services
jax-ws
Antonio
fuente
fuente
Respuestas:
Las siguientes opciones permiten el registro de todas las comunicaciones a la consola (técnicamente, solo necesita una de estas, pero eso depende de las bibliotecas que utilice, por lo que configurar las cuatro es una opción más segura). Puede configurarlo en el código como en el ejemplo, o como parámetro de línea de comando usando -D o como variable de entorno como escribió Upendra.
Consulte la pregunta Seguimiento de solicitudes / respuestas XML con JAX-WS cuando se produce un error para obtener más detalles.
fuente
Aquí está la solución en código sin formato (todo junto gracias a Stjohnroe y Shamik):
Donde está SOAPLoggingHandler (extraído de ejemplos vinculados):
fuente
ep.publish(publishURL);
: qué espublishURL
(en mi código, la url wsdl está incluida en el servicio en sí; no tengo ninguna url afuera. ¿Qué me pierdo?)Antes de iniciar tomcat,
JAVA_OPTS
configúrelo a continuación en envs de Linux. Entonces comienza Tomcat. Verá la solicitud y la respuesta en elcatalina.out
archivo.fuente
-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
Establezca las siguientes propiedades del sistema, esto habilitará el registro xml. Puede configurarlo en java o en el archivo de configuración.
registros de la consola:
fuente
Inyectar
SOAPHandler
a la interfaz de punto final. podemos rastrear la solicitud y respuesta SOAPImplementando SOAPHandler con Programmatic
Declarativo agregando
@HandlerChain(file = "handlers.xml")
anotaciones a su interfaz de punto final.handlers.xml
SOAPLoggingHandler.java
fuente
Hay varias formas de hacer esto mediante programación, como se describe en las otras respuestas, pero son mecanismos bastante invasivos. Sin embargo, si sabe que está utilizando JAX-WS RI (también conocido como "Metro"), puede hacerlo en el nivel de configuración. Consulte aquí para obtener instrucciones sobre cómo hacer esto. No hay necesidad de meterse con su aplicación.
fuente
// Esta solución proporciona una manera programática de agregar un controlador al cliente del servicio web sin la configuración XML
// Ver documento completo aquí: http://docs.oracle.com/cd/E17904_01//web.1111/e13734/handlers.htm#i222476
// Crea una nueva clase que implementa SOAPHandler
// Agregue de forma programática su LogMessageHandler
fuente
Estoy publicando una nueva respuesta, ya que no tengo suficiente reputación para comentar sobre la proporcionada por Antonio (ver: https://stackoverflow.com/a/1957777 ).
En caso de que desee que el mensaje SOAP se imprima en un archivo (por ejemplo, a través de Log4j), puede usar:
Tenga en cuenta que, en determinadas circunstancias, la llamada al método writeTo () puede no funcionar como se espera (consulte: https://community.oracle.com/thread/1123104?tstart=0 o https://www.java.net/node / 691073 ), por lo tanto, el siguiente código hará el truco:
fuente
Debe implementar un javax.xml.ws.handler.LogicalHandler, este controlador debe estar referenciado en un archivo de configuración del controlador, que a su vez está referenciado por una anotación @HandlerChain en su punto final de servicio (interfaz o implementación). Luego puede enviar el mensaje a través de system.out o un registrador en su implementación de processMessage.
Ver
http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_jaxwshandler.html
http://java.sun.com/mailers/techtips/enterprise/2006/TechTips_June06.html
fuente
Las respuestas enumeradas aquí que lo guían para usar
SOAPHandler
son completamente correctas. El beneficio de ese enfoque es que funcionará con cualquier implementación JAX-WS, ya que SOAPHandler es parte de la especificación JAX-WS. Sin embargo, el problema con SOAPHandler es que intenta implícitamente representar todo el mensaje XML en la memoria. Esto puede conducir a un gran uso de memoria. Varias implementaciones de JAX-WS han agregado sus propias soluciones para esto. Si trabaja con solicitudes grandes o respuestas grandes, entonces debe buscar uno de los enfoques propietarios.Dado que usted pregunta sobre "el incluido en JDK 1.5 o superior", responderé con respecto a lo que se conoce formalmente como JAX-WS RI (también conocido como Metro), que es lo que se incluye con el JDK.
JAX-WS RI tiene una solución específica para esto que es muy eficiente en términos de uso de memoria.
Ver https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri . Desafortunadamente, ese enlace ahora está roto, pero puedes encontrarlo en WayBack Machine. Daré los aspectos más destacados a continuación:
La gente de Metro en 2007 introdujo un tipo de controlador adicional
MessageHandler<MessageHandlerContext>
, que es propiedad de Metro. Es mucho más eficiente queSOAPHandler<SOAPMessageContext>
ya que no intenta hacer una representación DOM en memoria.Aquí está el texto crucial del artículo original del blog:
(Cita final de la publicación del blog de 2007)
No hace falta decir que su controlador personalizado,
LoggingHandler
en el ejemplo, debe agregarse a su cadena de controlador para tener algún efecto. Esto es lo mismo que agregar cualquier otroHandler
, por lo que puede buscar en las otras respuestas en esta página cómo hacerlo.Puede encontrar un ejemplo completo en el repositorio de Metro GitHub .
fuente
Podrías intentar poner un
ServletFilter
frente al servicio web e inspeccionar la solicitud y la respuesta al servicio devuelto / devuelto.Aunque específicamente no solicitó un proxy, a veces encuentro que tcptrace es suficiente para ver qué sucede en una conexión. Es una herramienta simple, sin instalación, muestra los flujos de datos y también puede escribir en el archivo.
fuente
En tiempo de ejecución , simplemente podría ejecutar
como dump es una var pública definida en la clase de la siguiente manera
fuente
¿Estoy en lo cierto al entender que desea cambiar / acceder al mensaje XML sin procesar?
Si es así, usted (o dado que tiene cinco años, el próximo tipo) podría querer echar un vistazo a la interfaz del proveedor que forma parte de JAXWS. La contraparte del cliente se realiza utilizando la clase "Despacho". De todos modos, no tiene que agregar controladores o interceptores. Aún PUEDES, por supuesto. La desventaja es de esta manera, usted es COMPLETAMENTE responsable de construir el SOAPMessage, pero es fácil, y si eso es lo que quiere (como yo hice), esto es perfecto.
Aquí hay un ejemplo para el lado del servidor (poco torpe, fue solo para experimentar):
Lo publicas como lo harías con un SEI,
O puede usar una clase Endpoint para ello. Espero que haya sido útil.
Y, si lo desea, no necesita ocuparse de los encabezados y demás, si cambia el modo de servicio a PAYLOAD (solo obtendrá el cuerpo del jabón).
fuente
con los archivos de configuración logback.xml, puede hacer:
Eso registrará la solicitud y la respuesta de esta manera (dependiendo de su configuración para la salida del registro):
fuente
Había estado tratando de encontrar alguna biblioteca de marco para registrar la solicitud y respuesta del servicio web durante un par de días. El siguiente código solucionó el problema para mí:
fuente
Una forma de hacerlo es no usar su código, sino usar rastreadores de paquetes de red como Etheral o WireShark, que pueden capturar el paquete HTTP con el mensaje XML como carga útil y puede seguir registrándolos en un archivo más o menos.
Pero el enfoque más sofisticado es escribir sus propios manejadores de mensajes. Puedes echarle un vistazo aquí .
fuente
Realmente. Si observa las fuentes de HttpClientTransport, notará que también está escribiendo mensajes en java.util.logging.Logger. Lo que significa que también puede ver esos mensajes en sus registros.
Por ejemplo, si está utilizando Log4J2, todo lo que necesita hacer es lo siguiente:
Después de estos pasos, comenzará a ver mensajes SOAP en sus registros.
fuente
Hay un par de respuestas usando SoapHandlers en este hilo. Debe saber que SoapHandlers modifica el mensaje si
writeTo(out)
se llama.Llamar al
writeTo(out)
método SOAPMessagesaveChanges()
también llama automáticamente al método. Como resultado, se pierden todos los datos binarios MTOM / XOP adjuntos en un mensaje.No estoy seguro de por qué sucede esto, pero parece ser una característica documentada.
https://docs.oracle.com/javase/7/docs/api/javax/xml/soap/SOAPMessage.html#saveChanges ()
fuente
Si ejecuta un servidor de aplicaciones IBM Liberty, simplemente agregue ibm-ws-bnd.xml en el directorio WEB-INF.
fuente