2009-06-25 13 views
0

这个问题一直困扰着我好几天。希望以前有人遇到过这种情况,并制定了一种解决方法。Java 1.3下的SoapAction问题

所以我开发了一个中间件Java应用程序,它在执行过程中调用一个SOAP动作。然而

 // 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库,所有上述工作/编译/:现在,此位下的1.6 JDK代码的行为运作良好执行,除了头部的SOAPAction字段为空。奇怪的是,当我检查该标题的值是什么时(设置标题后立即显示的行),会显示相应的值。但是,当它通过电线时,该字段是空的。由于这是指示我想要处理器的资源的字段,所以我的信息在门口被转回。

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

UPDATE:

在我的类路径中的库如下:

  • 的Xerces(resolver.jar,串行的.jar,xercesImpl.jar,XML-apis.jar)
  • SAAJ(没有saaj.jar)
  • 轴线(axis.jar
  • JAX-RPC(没有jaxrpc.jar)
  • 标准SOAP(activation.jar,它的mail.jar,的soap.jar,xerces.jar的)
  • 通用日志发现提前

谢谢!

回答

0

它看起来像这样实际上可能是一个疏忽或错误,但无论如何我的解决方法是手动处理下级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的解决方案还要好。

0

特殊。你说你在链接SOAP库 - 哪一个,确切地说?

我不会伤害尝试不同的SOAP堆栈,如CXF或JAX-WS-RI,尽管如果其中任何一个支持java 1.3,我都会感到惊讶。

+0

谢谢。将尝试JAX-WS-RI。 还将库添加到初始文章。 – 2009-06-26 18:24:28