2009-06-25 7 views
0

Ce problème m'a dérangé pendant des jours. Espérons que quelqu'un a déjà rencontré cela et a développé une solution de contournement. J'ai donc développé une application Java middleware qui, lors de son exécution, appelle une action SOAP. Maintenant, le comportement de ce morceau de code sous le JDK 1.6 fonctionne bien:SoapAction Problème sous Java 1.3

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

Cependant, lorsque j'utilise ce même code sous 1.3 ou 1.4 JDK avec les bibliothèques SOAP liées, tout au-dessus des œuvres/compile/exécute, sauf le fait que le champ SOAPAction de l'en-tête est vide. Assez bizarrement, quand je vérifie quelle est la valeur de cet en-tête (les lignes immédiatement après la mise en place de l'en-tête) la valeur appropriée est affichée. Cependant, quand il passe sur le fil, le champ est vide. Comme c'est le champ qui indique la ressource que je veux au processeur, mes messages sont retournés à la porte.

Quelqu'un at-il déjà rencontré ce problème? Si oui, y a-t-il des solutions possibles? (Je suis, bien sûr, prêt à utiliser une autre bibliothèque si nécessaire.)

MISE À JOUR:

Les bibliothèques sur mon chemin de classe sont les suivantes:

  • Xerces (resolver.jar, sérialiseur jar, xercesImpl.jar, xml-apis.jar)
  • Saaj (saaj.jar)
  • axe (axis.jar
  • JAX-RPC (jaxrpc.jar)
  • SOAP standard (activation.jar, mail.jar, soap.jar, xerces.jar)
  • Commons Logging et découverte

Merci à l'avance!

Répondre

0

On dirait que cela peut effectivement être un oubli ou un bug, mais en tout cas ma solution était de gérer les choses HTTP bas niveau manuellement, à savoir:

 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; 

Transforme c'est beaucoup plus concise que la solution basée sur SOAP.

0

Spécifique. Vous dites que vous faites un lien dans les bibliothèques SOAP - lesquelles exactement?

Je ne ferais pas de mal à essayer une pile SOAP différente, comme CXF ou JAX-WS-RI, bien que je serais surpris si l'un de ces deux Java 1.3 pris en charge.

+0

Merci. Va essayer JAX-WS-RI. Également ajouté les bibliothèques à la publication initiale. –