2012-09-17 21 views
5

Java - JDK 1.6.0.7 - WSGEN -version: JAX-WS RI 2.2.3-b01-Java (dịch vụ web - SOAP) - Làm cách nào để thêm trình xử lý SOAP ở phía máy khách và bật MTOM đúng?


Tôi có vấn đề sau đây:

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

Với mã này SOAPHeader là đúng , nhưng tệp đính kèm luôn là văn bản base64 nội dòng.

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

Khi handlerChain là nhận xét ra, bạn sẽ thấy những tập tin đính kèm như một tài liệu tham khảo XOP, nhưng không có SOAPHeader và do đó, khách hàng không được chứng thực ...

Làm thế nào tôi có thể thêm một handler trên phía khách hàng và cho phép MTOM chính xác?

Trả lời

6

Im không chắc chắn nếu tôi đã nhận câu hỏi đúng, nhưng tôi nghĩ rằng tôi đã có cùng một vấn đề của bạn một vài tháng trước đây, vì vậy đây là giải pháp của tôi:

Trước tiên, bạn cần một lớp HeaderHandler, mà tạo ra các tiêu đề xà phòng phần tử, nó sẽ giống như thế này:


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

Sau đó bạn tạo một HeaderHandlerResolver để xử lý việc tạo header và chèn nó trong một chuỗi xử lý:


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

Sau đó, bạn thêm vào các Chủ đầu tư:


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

Bằng cách này, tôi đã không kiểm tra tiêu đề đặc biệt này, tôi sửa đổi một handler tiêu đề trước tôi đã có, vì vậy nó có thể không chính xác, nhưng tôi nghĩ rằng nó khá gần, tôi thực sự hy vọng nó sẽ giúp bạn, hãy thử nó và cho chúng tôi biết làm thế nào nó đến, tôi sẽ cố gắng giúp bạn nếu nó vẫn không hoạt động.

+1

Câu trả lời này là hữu ích cho tôi khi tôi cần thiết để thiết lập một loggingHandler (một cái gì đó mà đăng xuất các yêu cầu/phản ứng) trong một khách hàng ws. Cảm ơn. – riskop

+0

Kết quả của việc trả về false từ phương thức handleFault là gì? Và những gì về trả về null từ phương thức getHeaders? –

+0

@NicholasDiPiazza return false sẽ chặn xử lý tin nhắn, về cơ bản bạn đang nói "nếu trình xử lý này không xóa toàn bộ thư", hãy kiểm tra https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/ Handler.html # handleFault (C) Khi trả về null trong getHeaders bạn là "trình xử lý này không xử lý tiêu đề cụ thể", đó là lý do tại sao chúng tôi có trình xử lý bộ xử lý riêng của mình, bạn có thể loại bỏ trình xử lý bằng cách trả về tiêu đề phải nhưng tôi chưa thử nó https://docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/SOAPHandler.html#getHeaders() –

Các vấn đề liên quan