2009-06-25 4 views
0

この問題は数日間悩まされています。うまくいけば、誰かがこれまでにこの問題に遭遇し、回避策を開発しています。SoapAction Java 1.3の下での問題

私は実行中にSOAPアクションを呼び出すミドルウェアのJavaアプリケーションを開発しました。さて、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);  

をしかし、私はリンクSOAPライブラリと1.3または1.4 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

    SOAPベースのソリューションよりも優れています。

    0

    特有のものです。あなたは、SOAPライブラリにリンクしていると言います。

    CXFやJAX-WS-RIなどの別のSOAPスタックを試しても痛いことはありませんが、いずれかのJava 1.3がサポートされていれば驚いています。

     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; 
    

    が、これははるかに簡潔で判明:これは実際に見落としやバグかもしれませんが、いずれにせよ、私の回避策は、手動で下位レベルのHTTPのものを処理するためだった、すなわちのように見えます

    +0

    ありがとうございました。 JAX-WS-RIを試してみましょう。 また、最初の投稿にライブラリを追加しました。 –