Java - JDK 1.6.0.7 - WSGEN -version: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正确?

#1楼 票数:8

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

首先你需要一个HeaderHandler类,它创建了soap header元素,它应该如下所示:


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

顺便说一句,我没有测试这个特殊的标题,我修改了我以前的标题处理程序,所以它可能不准确,但我认为它非常接近,我真的希望它可以帮助你,尝试一下并告诉我们如何它来了,如果它仍然不起作用,我会尽力帮助你。

  ask by user2017 translate from so

未解决问题?本站智能推荐:

1回复

发送到客户端后,JAX-WS MTOM删除附件

我正在使用Java 1.6的JAX-WS的参考实现。 在我的服务器上,我有Web Service方法,该方法返回带有附件的响应作为javax.activation.DataHandler。 我需要做的是将文件从服务器完全发送到客户端后,将其删除 。 但是,我的webservice方法
2回复

无法使用jax-ws从带有MTOM的SOAP获取PDF

我试图获取从Web服务调用返回的PDF。 使用SoapUI和其他日志记录,我可以看到答复中附带了PDF。 但是我尝试获取PDF失败。 PDF的DataHandler不包含任何数据。 因此/tmp/out.pdf文件为空。 使用缓冲区写入PDF会得到相同的结果: 我试图通过
2回复

使用JAX-WS构建大型MTOM / XOP消息

我有一个关于在JAX-WS中使用MTOM / XOP的问题。 我正在编写一个发送大量二进制数据的Web服务。 客户端请求许多文件,服务器返回响应中的文件。 我能够正确地构建响应,以便正确实现XOP,但我遇到了与内存相关的问题,因为它在发送之前将整个响应存储在内存中。 此Web服务发送
1回复

使用iOS中的MTOM通过Soap消息上传文件

我在这里找到了通过Soap消息上传文件的详细信息。 但是我有另一个问题,如果Soap中有大文件,那么它会产生内存问题导致内存中的文件加载,以便通过Soap消息发送 。 我读到了MTOM(消息传输优化机制)。 “当您使用MTOM / XOP优化SOAP消息时 , XOP处理将其序列化为M
1回复

MTOM附件在SOAP有效负载中编码两次

我确定这只是飞行员错误,但找不到解决方案。 有一个jax-ws Web服务,其肥皂有效负载操作包括附件。 这是模式文档的片段。 这是定义的类型: 嵌入此元素定义中: 使用soapUI,SOAP看起来像: soapUI中的附件: 当我从日志中查看http时:
1回复

禁用非MTOM SOAP消息或在CXF中限制其大小

我在CXF(或SOAP)中遇到了这个问题。 当我同时在服务器和客户端上启用MTOM请求时,我的应用程序运行良好,Java堆大小不会呈指数增长。 但是,如果某些客户端决定不使用MTOM发送LARGE(我的意思是500MB +附件为B64编码格式)消息,就会出现问题,这将导致Java堆大小呈指数
1回复

带有MTOM附件的wsdl2cpp客户端的wso2 cpp代码生成

我有一个用axis2(Java)公开的soap Web服务,该服务将POJO(例如具有名称的Person等)序列化为动作响应。 此外,我有一个使用序列化DataHandler的操作,以便使用<xop:Include ...></xop:Include>将二进制附件放入响
6回复

添加SOAP请求的附件

关于如何在SOAP请求中添加附件,我处于松散状态。 我们必须使用java内置的第三方Web服务,这是我遇到的最复杂的事情。 我们使用的任何其他Web服务(需要附件)都有方法或属性来添加附件。 简单。 但是,这个没有提供这样的方法。 我们一起得到了一个SOAP消息的版本,这与我们想要