当前位置: 首页 > 知识库问答 >
问题:

SOAP前缀soapenv已经绑定到超文本传输协议://

柴彬
2023-03-14

我正在尝试向SOAP请求添加自定义命名空间声明,更具体地说:

env.addNamespaceDeclaration("soapenv", "http://www.w3.org/2003/05/soap-envelope");

我在SOAP消息处理程序中执行此操作,根据我使用的Web服务的规范,此命名空间声明是绝对必需的。但是,jax ws库似乎总是在发送消息之前尝试添加此soapenv命名空间声明,然后失败如下:

Exception in thread "main" javax.xml.ws.WebServiceException: javax.xml.stream.XMLStreamException: prefix soapenv has been already bound to http://www.w3.org/2003/05/soap-envelope. Rebinding it to http://schemas.xmlsoap.org/soap/envelope/ is an error
    at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:101)
    at com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:267)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:196)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:122)
    at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:95)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:626)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:585)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:570)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:467)
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:308)
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:163)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:135)
    at com.sun.proxy.$Proxy32.getAccountBalance(Unknown Source)
    at XXXX.ClientTest.getAccountData(ClientTest.java:60)
    at XXXX.ClientTest.<init>(ClientTest.java:55)
    at XXXX.ClientTest.main(ClientTest.java:30)
Caused by: javax.xml.stream.XMLStreamException: prefix soapenv has been already bound to http://www.w3.org/2003/05/soIIap-envelope. Rebinding it to http://schemas.xmlsoap.org/soap/envelope/ is an error
    at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeNamespace(XMLStreamWriterImpl.java:1035)
    at com.sun.xml.internal.ws.util.DOMUtil.writeTagWithAttributes(DOMUtil.java:173)
    at com.sun.xml.internal.ws.message.saaj.SAAJMessage.writeTo(SAAJMessage.java:341)
    at com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:98)
    ... 17 more

HandleMessage函数:

public boolean handleMessage(SOAPMessageContext context) {

    //Inquire incoming or outgoing message.
    boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    try {

        if (outbound) {
            // OUTBOUND

            System.out.println("Direction=outbound (handleMessage)");
            SOAPMessage msg = ((SOAPMessageContext) context).getMessage();

            // get SOAP-Part
            SOAPPart sp = msg.getSOAPPart();

            //edit Envelope
            SOAPEnvelope env = sp.getEnvelope();
            env.addNamespaceDeclaration("web", "http://example.com/webservices");
            env.addNamespaceDeclaration("soapenv", "http://www.w3.org/2003/05/soap-envelope");
            env.removeNamespaceDeclaration("S");

            env.setPrefix("soapenv");


            SOAPHeader soapHeader = env.addHeader();
            SOAPBody soapBody = env.getBody();

            soapHeader.setPrefix("soapenv");
            soapBody.setPrefix("soapenv");

            Name ticketHeaderName = env.createName("TicketHeader", "web",
                   "http://example.com/webservices");
            SOAPElement ticketHeader =  soapHeader.addChildElement(ticketHeaderName);

            SOAPElement soapHeaderElem2 = ticketHeader.addChildElement("SessionId", "web");
            soapHeaderElem2.addTextNode(sessionId);

            msg.saveChanges();

            // print SOAP-Message
            dumpSOAPMessage(msg);

        } else {
            // INBOUND

            System.out.println("Direction=inbound (handleMessage)");
            SOAPMessage msg = ((SOAPMessageContext) context).getMessage();
            dumpSOAPMessage(msg);
         }

    } catch (Exception e) {

        //All other unhandled problems.
        e.printStackTrace();
    }
    return true;
}

共有1个答案

艾志尚
2023-03-14

使用SOAP1.1规范时会发生此错误

 <soapenv:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:web="http://saxobank.com/webservices/">

但是您尝试将名称空间设置为SOAP 1.2版本:

 <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"  xmlns:web="http://saxobank.com/webservices/">

编写正确规格的请求为我解决了这个问题。

 类似资料:
  • Hprose 远程过程调用(RPC)通讯可以在任何底层网络协议上传输。例如 HTTP,TCP 或 UNIX socket。 HTTP 绑定 当 hprose 远程过程调用(RPC)工作于 HTTP 之上时,hprose 远程过程调用(RPC)的数据作为 POST 请求的 body 部分发送,以响应的 body 部分返回。 Hprose 远程过程调用(RPC) 对 HTTP 的头部(head)没有任

  • 我正在使用GWT和Spring controller来管理http流量。有些请求可能需要很长时间,但我希望在超过给定时间时终止请求。 我如何配置超时Spring。我也使用Apache Tomcat 7.0。我试图在tomcat上inrease最大线程,但有一段时间tomcat工作缓慢,因为请求线程不会死。

  • 我们在Glassfish v4上创建了一个网站,它使用8080端口作为http,8081端口作为https。我们的cisco防火墙将请求转发到端口80到端口8080,并将请求转发到端口443到端口8081。 但是我们不希望用户能够访问超文本传输协议网站。我们希望将所有请求重定向到超文本传输协议站点到https。怎么能做到呢?在Glassfish管理面板中,我们对配置进行了更改-

  • 我已经安装了Apache 2.2负载平衡器和Weblogic 12c服务器。 我观察到一个https URL试图在我的应用程序中打开一个http URL,但没有成功,正如预期的那样。我搜索了一下为什么这会导致问题,并注意到了一些问题- http://geekexplains.blogspot.in/2008/06/https-becoming-http-in-case-of.html 当我试图寻找

  • 我只是有一个关于服务中http请求的结构和处理响应的问题。我正在使用Angular2。alpha46 Typescript(刚刚开始测试-我喜欢它…Ps…。感谢所有一直致力于它并通过github作出贡献的人) 因此,采取以下措施: 登录表单。组成部分ts 从这个组件中,我导入了我的userService,它将容纳我的超文本传输协议请求,以登录用户。 使用者服务ts 我想做的是能够处理http请求之

  • 我的LogCat: 签名密钥(sw)为https://api.dropbox.com/1/shares/dropbox/a.jpg?oauth_consumer_key=2f2y1dyuqhp58ek 我对http没有太多经验。。 因为httpPost=新的httpPost(sw);工作正常,这是否意味着基本字符串签名正确? 还是我错过了什么?