【问题标题】:SoapAction Issue under Java 1.3Java 1.3 下的 SoapAction 问题
【发布时间】:2009-06-25 21:43:21
【问题描述】:

这个问题困扰了我好几天。希望之前有人遇到过这种情况并制定了解决方法。

所以我开发了一个中间件 Java 应用程序,它在执行过程中会调用一个 SOAP 操作。现在,这段代码在 1.6 JDK 下的行为运行良好:

        // inside a try-catch block
        SOAPConnectionFactory soapConnectionFactory = 
                     SOAPConnectionFactory.newInstance();
        SOAPConnection connection = 
                  soapConnectionFactory.createConnection();
        MessageFactory messageFactory = MessageFactory.newInstance();          
        SOAPMessage soapMsg = messageFactory.createMessage();
        String soapAction = getHeaderUrl() + "/" + method + "\r\n";
        MimeHeaders headers = soapMsg.getMimeHeaders(); 
        headers.addHeader("SOAPAction", soapAction); 

       // review the SOAPAction header
        int header_count = 
           soapMsg.getMimeHeaders().getHeader("SOAPAction").length;
        out("SOAPActions (from Soap header): ");
        if (header_count == 0) out ("No SOAPActions defined.");
        for (int i=0; i<header_count; i++)
            out("SOAPAction["+i+"] = \"" + 
               soapMsg.getMimeHeaders().getHeader("SOAPAction")[i] 
                  + "\""); 


        SOAPPart soapPart = soapMsg.getSOAPPart();            
        StreamSource s = new StreamSource(new StringReader(msg));
        soapPart.setContent(s);
        soapMsg.saveChanges();
        ByteArrayOutputStream req_bytes = new ByteArrayOutputStream();
        soapMsg.writeTo(req_bytes);
        String req = new String(req_bytes.toByteArray());         
        SOAPMessage reply = connection.call(soapMsg, Url);      

但是,当我在 1.3 或 1.4 JDK 下使用完全相同的代码并链接了 SOAP 库时,上面的所有内容都可以正常工作/编译/执行,除了标头的 SOAPAction 字段为空。奇怪的是,当我检查该标题的值是什么(设置标题之后的行)时,会显示适当的值。但是,当它越过电线时,该字段是空的。由于这是向处理器指示我想要的资源的字段,因此我的消息在门口被退回。

以前有人遇到过这个问题吗?如果是这样,是否有可能的解决方法? (当然,如果需要,我愿意使用另一个库。)

更新:

我的类路径中的库如下:

  • Xerces(resolver.jar、serializer.jar、xercesImpl.jar、xml-apis.jar)
  • Saaj (saaj.jar)
  • 轴(axis.jar
  • JAX-RPC (jaxrpc.jar)
  • 标准 SOAP(activation.jar、mail.jar、soap.jar、xerces.jar)
  • 公共日志记录和发现

提前致谢!

【问题讨论】:

    标签: java soap http-headers jdk1.4


    【解决方案1】:

    很特别。您说您正在链接 SOAP 库 - 究竟是哪些?

    尝试不同的 SOAP 堆栈(例如 CXF 或 JAX-WS-RI)不会有什么坏处,尽管如果这两个堆栈中的任何一个支持 java 1.3,我会感到惊讶。

    【讨论】:

    • 谢谢。将尝试 JAX-WS-RI。还将库添加到初始帖子中。
    【解决方案2】:

    看起来这实际上可能是一个疏忽或错误,但无论如何我的解决方法是手动处理较低级别的 HTTP 内容,即:

            URL u = new URL(Url);
            URLConnection uc = u.openConnection();
            HttpURLConnection  conn = (HttpURLConnection) uc;
    
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("SOAPAction", getHeaderUrl() + "/" + method);
            conn.setRequestProperty("Content-type", "text/xml");
    
            OutputStream out = conn.getOutputStream();
            Writer wr = new OutputStreamWriter(out);
    
            wr.write(msg);
            wr.flush();
            wr.close();
    
            InputStream in = conn.getInputStream();
            String rsp="";
            int c;
            while ((c = in.read()) != -1) { 
                System.out.write(c);
                rsp = rsp.concat(String.valueOf((char)c));
            }
            in.close();
            rsp = deSOAP(rsp);
            response = response.fromXML(rsp);
            return response;
    

    事实证明,这也比基于 SOAP 的解决方案更简洁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2010-12-04
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多