2012-09-17 20 views
5

Java - JDK 1.6.0.7 - WSGEN -version: JAX-WS RI 2.2.3-b01-Java (servizio Web - SOAP) - Come aggiungere un gestore SOAP sul lato client e abilitare MTOM corretto?


Ho il seguente problema:

SOAPBinding binding = (SOAPBinding)((BindingProvider)port).getBinding(); 
binding.setMTOMEnabled(true); 

List<Handler> handlerChain = new ArrayList<Handler>(); 
handlerChain.addAll(binding.getHandlerChain()); 
handlerChain.add(new MyHandlerSecurity("admin", "admin")); 
binding.setHandlerChain(handlerChain); 

Con questo codice la SoapHeader è corretto , ma l'allegato è sempre un testo base64 incorporato.

//List<Handler> handlerChain = new ArrayList<Handler>(); 
//handlerChain.addAll(binding.getHandlerChain()); 
//handlerChain.add(new MyHandlerSecurity("admin", "admin")); 
//binding.setHandlerChain(handlerChain); 

Quando handlerChain è commentata, si vedrà l'allegato come un riferimento XOP, ma non c'è SoapHeader e, quindi, il client non è autenticato ...

Come posso aggiungere un gestore su il lato client e abilita MTOM corretto?

risposta

6

Im non sicuro se ho ottenuto la domanda giusta, ma credo di aver avuto il vostro stesso problema un paio di mesi fa, ecco la mia soluzione:

In primo luogo è necessaria una classe HeaderHandler, wich crea l'intestazione di sapone elemento, dovrebbe assomigliare a questo:


import javax.xml.namespace.QName; 
    import javax.xml.soap.SOAPElement; 
    import javax.xml.soap.SOAPEnvelope; 
    import javax.xml.soap.SOAPHeader; 
    import javax.xml.ws.handler.MessageContext; 
    import javax.xml.ws.handler.soap.SOAPHandler; 
    import javax.xml.ws.handler.soap.SOAPMessageContext; 


    public class HeaderHandler implements SOAPHandler<SOAPMessageContext> { 

     public boolean handleMessage(SOAPMessageContext smc) { 
      Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
      String AUTH_TK = "http://www.myurl.com:port/subdir/etc/"; 
      String NOPREFIX="";//no prefix 
      String PREFIX_XMLNS="xmlns"; 
      String value = "123456"; 
      if (outboundProperty.booleanValue()) { 
       try { 
        SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope(); 
        SOAPHeader header = envelope.addHeader(); 
        //<AuthorizationToken xmlns="http://www.myurl.com:port/subdir/etc/"> 
        SOAPElement authorizationToken = header.addChildElement("AuthorizationToken", PREFIX_XMLNS, AUTH_TK); 
        //<Token>value</Token> 
        SOAPElement usernameToken = 
         authorizationToken.addChildElement("Token", NOPREFIX); 
         usernameToken.addTextNode(value); 
         //<Token>value</Token> 
        SOAPElement usernameToken = 
         authorizationToken.addChildElement("Token", PREFIX); 
         usernameToken.addTextNode(value); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return outboundProperty; 
     } 


     public Set<QName> getHeaders() { 
      return null; 
     } 

     public void close(MessageContext arg0) { 

     } 

     public boolean handleFault(SOAPMessageContext arg0) { 
      return false; 
     } 
    } 

Dopo di che si crea un HeaderHandlerResolver per gestire la creazione di intestazione e inserirlo in una catena gestore:


import java.util.ArrayList; 
    import java.util.List; 
    import javax.xml.ws.handler.Handler; 
    import javax.xml.ws.handler.HandlerResolver; 
    import javax.xml.ws.handler.PortInfo; 

    public class HeaderHandlerResolver implements HandlerResolver { 

    @SuppressWarnings("unchecked") 
    public List<Handler> getHandlerChain(PortInfo portInfo) { 
      List<Handler> handlerChain = new ArrayList<Handler>(); 
      HeaderHandler hh = new HeaderHandler(); 
      handlerChain.add(hh); 
      return handlerChain; 
     } 
    } 

Dopo di che, si aggiunge il Cliente:


 try{ 
      //new service instance (your service should be extending javax.xml.ws.Service;) 
      YourServiceProxy service = new YourServiceProxy(); 
      //calls the header handler resolver ;) 
      service.setHandlerResolver(new HeaderHandlerResolver()); 
      //get the service 
      YourService port = (YourService)service.getYourService(); 
      //call the service 
      port.yourMethod() 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

A proposito, non ho provato questo intestazione particolare, ho modificato un gestore di intestazione precedente ho avuto, quindi potrebbe non essere accurato, ma penso che sia abbastanza vicino, spero davvero che ti aiuti, provalo e dicci come verrà, cercherò di aiutarti se ancora non funziona.

+1

Questa risposta era usefult per me quando avevo bisogno di impostare un loggingHandler (qualcosa che registra le richieste/risposte) in un client ws. Grazie. – riskop

+0

Qual è il risultato della restituzione di false dal metodo handleFault? E che ne dici di restituire null dal metodo getHeaders? –

+0

@NicholasDiPiazza restituendo false bloccherà l'elaborazione del messaggio, stai praticamente dicendo "se questo gestore non riesce a scartare l'intero messaggio" controlla https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ Handler.html # handleFault (C) Quando restituisci null in getHeaders sei "questo gestore non gestisce un'intestazione specifica", motivo per cui abbiamo il nostro risolutore di gestori, in modo retrospettivo puoi probabilmente eliminare il risolutore di handler restituendo il intestazioni giuste ma non l'ho provato https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –

Problemi correlati