2012-09-17 23 views
5

Java - JDK 1.6.0.7 - WSGEN -version: JAX-WS RI 2.2.3-b01-Java (usługa internetowa - SOAP) - Jak dodać obsługę SOAP po stronie klienta i włączyć obsługę MTOM?


Mam następujący problem:

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

Z tym kodzie SoapHeader jest poprawna , ale załącznik jest zawsze tekstem podstawowym64.

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

Kiedy handlerChain jest wypowiedziało się, widać przywiązanie jako odniesienie xop, ale nie ma SoapHeader a więc klient nie zostanie uwierzytelniony ...

Jak mogę dodać obsługi na po stronie klienta i włączyć obsługę MTOM?

Odpowiedz

6

Nie jestem pewien, czy mam pytanie rację, ale myślę, że miał swój sam problem kilka miesięcy temu, więc tu jest moje rozwiązanie:

Najpierw trzeba klasę HeaderHandler, wich tworzy nagłówek mydła Element, powinno to wyglądać tak:


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

Następnie należy utworzyć HeaderHandlerResolver do obsługi tworzenia nagłówka i wstawić go w łańcuchu handler:


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

Po tym, dodać Klienta:


 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(); 
     } 

Nawiasem mówiąc, nie przetestowane ten konkretny nagłówek, i zmodyfikowany poprzedni obsługi nagłówka miałem, więc może nie być dokładne, ale myślę, że jest blisko, mam nadzieję, że ci pomoże, wypróbujesz i powiesz, jak to się stanie, spróbuję ci pomóc, jeśli nadal nie działa.

+1

Ta odpowiedź była przydatna dla mnie, gdy potrzebowałem skonfigurować loggingHandler (coś, co wylogowuje żądania/odpowiedzi) w kliencie ws. Dzięki. – riskop

+0

Jaki jest wynik zwracania wartości false z metody handleFault? A co z zwracaniem wartości null z metody getHeaders? –

+0

@NicholasDiPiazza return false zablokuje przetwarzanie wiadomości, w zasadzie mówisz "jeśli ten program obsługi zakończy się niepowodzeniem, odrzuć całą wiadomość" sprawdź https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ Handler.html # handleFault (C) Podczas zwracania wartości null w getHeaders, jesteś "ten program obsługi nie obsługuje żadnego konkretnego nagłówka", dlatego mamy wtedy nasz własny program obsługi, retrospektywnie prawdopodobnie możesz pozbyć się programu obsługi resolvera, zwracając prawe nagłówki, ale nie wypróbowałem tego https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –