jax-ws e gli handlers: esempio di logging

Nell’ambito di realizzazione di un webservice utilizzando jax-ws, gli handlers sono un meccanismo molto semplice e molto efficace per intercettare le chiamate SOAP e “fare qualcosa” prima di passare controllo alla classe che implementa il webservice.

Il tutto in 3 semplici passaggi:

  • Scrivere l’handler
  • Inserire l’handler nella catena degli handlers
  • dire al webservice di utilizzare la catena degli handlers

Scrivere l’Handler
E’ semplicemente necessario implementare la classe SOAPHandler ed estendere i metodi necessari:

public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {
 
	@Override
	public void close(MessageContext context) {}
 
	private void gestisciIlTuoLogComeTiPare(SOAPMessageContext smc) {
 
		Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
 
		if (outboundProperty.booleanValue()) {
			// Il messaggio è in uscita
                        ...
			} else {
                        // Il messaggio è in entrata
                        ...
		}
                SOAPMessage message = smc.getMessage();
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		message.writeTo(out);
		String ilMessaggioSoap = new String(out.toByteArray());
                ...
                ...
	}
 
	@Override
	public Set<javax.xml.namespace.QName> getHeaders() {
		// TODO Auto-generated method stub
		return null;
	}
 
 
	@Override
	public boolean handleFault(SOAPMessageContext context)  {
		return true;
	}
 
 
	@Override
	public boolean handleMessage(SOAPMessageContext context) {
                gestisciIlTuoLogComeTiPare(context);
		return true;
	}	
}

Utilizzando l’oggetto SOAPMessageContext è possibile avere tutte le informazioni sul messaggio SOAP in arrivo o in uscita, come ad esempio il fatto se sia in ingresso o in uscita:

Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

o il messaggio stesso:

SOAPMessage message = smc.getMessage();

Definire la catena degli handlers
Le definizioni di tutti gli handlers devono essere racconte in un file .xml, che si può chiamare come volete voi, ad esempio handlers.xml, fatto in questo modo:

<?xml version="1.0" encoding="UTF-8"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">  
   <handler-chain>
 
      <handler>  
         <handler-class>it.nicola.handlers.PrivacyHandler</handler-class>  
      </handler>  
 
      <handler>  
         <handler-class>it.nicola.handlers.LoggingHandler</handler-class>  
      </handler>
 
   </handler-chain>  
</handler-chains>

In ogni elemento va specificata una classe che implementa l’interfaccia SOAPHandler, come la mia fantastica LoggingHandler.

Utilizzare la catena degli handlers
A questo punto non rimane che dire al webservice che deve prendere in considerazione la catena degli handler, e lo si fa con questa annotazione:

@WebService("...")
@HandlerChain(file = "handlers.xml")

In questo caso, utilizzando io maven, posizioni il file handlers.xml nella cartella resources.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>