Queremos interceptar el WS en la salida y la entrada. Esto puede ser útil para:
- Hacer log de alguna parte del mensaje
- Llevar registro de mensajes enviados
- Controles de seguridad añadidos
- ….
Hoy vamos a hacer un ejemplo de log de la entrada/salida del WS.
Anotamos el WS con el descriptor de la cadena de manejadores:
@WebService @HandlerChain(file="src/META-INF/handlerChain.xml") public class Hello { @WebMethod public String sayHello(String name) { return "Hello, "+name+"."; } } |
Que tendrá el contenido siguiente:
<?xml version="1.0" encoding="UTF-8"?> <handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-class>lebrijo.handlers.WSHandler</handler-class> </handler> </handler-chain> </handler-chains> |
La clase WSHandler implementará la interfaz SOAPHandler:
public class WSHandler implements SOAPHandler<SOAPMessageContext> { public Set<QName> getHeaders() { return null; } public boolean handleFault(SOAPMessageContext context) { logToSystemOut(context); return true; } public boolean handleMessage(SOAPMessageContext context) { logToSystemOut(context); return true; } private void logToSystemOut(SOAPMessageContext smc) { Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outboundProperty.booleanValue()) { System.out.println("\nOutgoing message:"); } else { System.out.println("\nIncoming message:"); } SOAPMessage message = smc.getMessage(); try { message.writeTo(System.out); } catch (Exception e) { System.out.println("Exception in handler: " + e); } } public void close(MessageContext context) { // TODO Auto-generated method stub } |