【问题标题】:Java (web service - SOAP) - How do I add a SOAP handler on the client side and enable MTOM correct?Java(Web 服务 - SOAP) - 如何在客户端添加 SOAP 处理程序并正确启用 MTOM?
【发布时间】:2012-09-09 16:54:49
【问题描述】:

Java - JDK 1.6.0.7 - WSGEN -版本:JAX-WS RI 2.2.3-b01-


我有以下问题:

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

使用此代码,SoapHeader 是正确的,但附件始终是内联 base64 文本。

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

当handlerChain被注释掉时,你会看到附件是一个xop引用,但是没有SoapHeader,因此客户端没有被认证......

如何在客户端添加处理程序并正确启用 MTOM?

【问题讨论】:

    标签: java soap jax-ws attachment mtom


    【解决方案1】:

    我不确定我的问题是否正确,但我想几个月前我遇到了同样的问题,所以这是我的解决方案:

    首先你需要一个 HeaderHandler 类,它会创建soap头元素,它应该是这样的:


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

    之后,您创建一个 HeaderHandlerResolver 来处理标头创建并将其插入到处理程序链中:


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

    之后,添加客户端:


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

    顺便说一句,我没有测试这个特定的头文件,我修改了我以前的头文件处理程序,所以它可能不准确,但我认为它非常接近,我真的希望它对你有帮助,试试看告诉我们它是怎么来的,如果它仍然不起作用,我会尽力帮助你。

    【讨论】:

    • 当我需要在 ws 客户端中设置 loggingHandler(注销请求/响应的东西)时,这个答案对我很有用。谢谢。
    • handleFault方法返回false的结果是什么?那么从 getHeaders 方法返回 null 呢?
    • @NicholasDiPiazza 返回 false 将阻止消息处理,您基本上是在说“如果此处理程序失败丢弃整个消息”检查 docs.oracle.com/javaee/5/api/javax/xml/ws/handler/… 在 getHeaders 中返回 null 时,您是“此处理程序不处理特定标头",这就是我们拥有自己的处理程序解析器的原因,回想起来,您可能可以通过返回正确的标头来摆脱处理程序解析器,但我还没有尝试过 docs.oracle.com/javaee/5/api/javax/xml/ws/handler/soap/…
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2011-10-11
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多