SOAP Message Handler no lado cliente

Esse exemplo apresenta a utilização de um handler atachado no cliente de web service.
O que o handler faz é salvar em disco a mensagem SOAP de saída.

Em geral, o uso de handler no lado cliente pode ser útil para:
– alterar o conteúdo da mensagem ou manter log da mensagem
– assinatura digital
– adicionar dados de autenticação e segurança

Os exemplos a seguir foram testados com as seguintes versões de programa:
– jboss-eap-6.1
– JDK 7_0_10
– Eclipse Juno

A geração do cliente do web service pode ser verificada neste outro post: clique aqui.

Estruturei o projeto no eclipse da seguinte forma:

img-projeto-handler-eclipse


Fonte “ClienteWS.java”:


import java.net.MalformedURLException;
import br.teste.WSTeste;
import br.teste.WSTesteService;

public class ClienteWS {	
  public static void main(String[] args) throws MalformedURLException {
	        
    WSTeste ws = new WSTesteService().getWSTestePort();
 
    //instancia a classe do handler
    ClientHandler sh = new ClientHandler();
  	    
    java.util.List handlerChain = new java.util.ArrayList();
    handlerChain.add(sh);

    //configura a cadeia de handlers 
    ((javax.xml.ws.BindingProvider)ws).getBinding().setHandlerChain(handlerChain);

    //invoca método
    ws.dizerOla("Sr. X");		
  }	
}

Fonte “ClienteHandler.java”:


 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.OutputStream;
 import java.util.Calendar;
 import java.util.Set;
 import javax.xml.namespace.QName;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.handler.soap.SOAPHandler;
 import javax.xml.ws.handler.soap.SOAPMessageContext;

public class ClientHandler implements SOAPHandler{

 @Override
 public boolean handleMessage(SOAPMessageContext mc) {		
   if (Boolean.TRUE.equals(mc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY))) {			
    SOAPMessage message = mc.getMessage();
    try {
     javax.xml.transform.TransformerFactory tff = javax.xml.transform.TransformerFactory.newInstance();
     javax.xml.transform.Transformer tf = tff.newTransformer();

     javax.xml.transform.Source sc = message.getSOAPPart().getContent();

     OutputStream os1 = new ByteArrayOutputStream(); 
     javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(os1);
     tf.transform(sc, result); 
							
     //define o arquivo onde será salvo a mensagem SOAP				
     FileOutputStream flw = new FileOutputStream(new File("C:\\xmlHandler_"+ Calendar.getInstance().getTimeInMillis() +".xml"));
     flw.write(((ByteArrayOutputStream) os1).toByteArray());
     flw.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
  }
  return true;
 }
 @Override
 public void close(MessageContext context) {
 }
 @Override
 public boolean handleFault(SOAPMessageContext context) {
   return false;
 }
 @Override
 public Set getHeaders() {
   return null;
 }
}

Segue a mensagem salva em disco. No arquivo ClienteHandler.java está definido para salvar em C:\xmlHandler…xml

handler-msg-salva

Links
http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBWorks2.html
http://fusesource.com/docs/esb/4.2/jaxws/JAXWSLogicalHandlersMessage.html

Ótimo material neste link:
http://www.jroller.com/gmazza/entry/jaxws_handler_tutorial

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s