2009-06-25 8 views
0

Dieses Problem stört mich seit Tagen. Hoffentlich ist jemand schon einmal darauf gestoßen und hat einen Workaround entwickelt.SoapAction Problem unter Java 1.3

Also habe ich eine Middleware-Java-App entwickelt, die während ihrer Ausführung eine SOAP-Aktion aufruft. Nun wird das Verhalten dieses Stückes Code unter dem JDK 1.6 gut arbeiten:

 // 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);  

Allerdings, wenn ich genau diesen gleichen Code unter 1.3 oder 1.4 JDK verwenden, um mit den SOAP-Bibliotheken verknüpft, alles über Werken/kompiliert/Führt aus, außer dass das Feld SOAPAction des Headers leer ist. Seltsamerweise, wenn ich überprüfe, was der Wert dieses Headers ist (die Zeilen unmittelbar nach dem Einrichten der Kopfzeile), wird der entsprechende Wert angezeigt. Wenn es jedoch über die Leitung geht, ist das Feld leer. Da dies das Feld ist, das die Ressource anzeigt, die ich an den Prozessor senden möchte, werden meine Nachrichten an der Tür zurückgegeben.

Hat jemand dieses Problem schon einmal erlebt? Wenn ja, gibt es mögliche Problemumgehungen? (Ich bin, natürlich bereit, eine andere Bibliothek zu verwenden, wenn erforderlich.)

UPDATE:

Die Bibliotheken auf meinem Classpath sind wie folgt:

  • Xerces (resolver.jar, Serializer .jar-, xercesImpl.jar, xml-apis.jar)
  • Saaj (saaj.jar)
  • Achse (axis.jar
  • JAX-RPC (jaxrpc.jar)
  • Standard-SOAP (activation.jar, mail.jar, soap.jar, xerces.jar)
  • Commons und Entdeckung

Vielen Dank im Voraus anmelden!

Antwort

0

Es sieht wie folgt aus kann tatsächlich ein Versehen oder einen Fehler, aber auf jeden Fall war mein Problem zu umgehen, die auf niedrigerer Ebene HTTP Sachen manuell zu handhaben, das heißt:

 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; 

stellte sich heraus, das ist deutlich prägnanter als die SOAP-basierte Lösung.

0

Eigenartig. Sie sagen, Sie verlinken in den SOAP-Bibliotheken - welche genau?

Ich würde nicht schaden, einen anderen SOAP-Stack, wie CXF oder JAX-WS-RI zu versuchen, obwohl ich überrascht hätte, wenn einer dieser beiden Java 1.3 unterstützt.

+0

Danke. Werde JAX-WS-RI versuchen. Auch die Bibliotheken zum ursprünglichen Post hinzugefügt. –