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
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