Question

Ce problème me préoccupe depuis des jours. J'espère que quelqu'un a déjà découvert cela et a mis au point 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 bit de code sous le JDK 1.6 fonctionne bien:

        // 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 JDK 1.3 ou 1.4 avec les bibliothèques SOAP liées, tout ce qui précède fonctionne / compile / exécute, à l'exception du fait que le champ SOAPAction de l'en-tête est vide Bizarrement, lorsque je vérifie la valeur de cet en-tête (les lignes qui suivent immédiatement la configuration 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 renvoyés à la porte.

Quelqu'un at-il déjà rencontré ce problème? Si tel est le cas, existe-t-il des solutions de contournement possibles? (Je suis bien sûr disposé à utiliser une autre bibliothèque si nécessaire.)

UPDATE:

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

  • Xerces (resolver.jar, serializer.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)
  • Journalisation et découverte communes

Merci d'avance!

Était-ce utile?

La solution 2

Il semble que cela puisse en réalité être un oubli ou un bogue, mais ma solution de contournement consistait à gérer manuellement le contenu HTTP de niveau inférieur, c'est-à-dire.

        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;

Il s’avère que cette solution est également beaucoup plus concise que la solution SOAP.

Autres conseils

Bizarre. Vous dites que vous créez des liens dans les bibliothèques SOAP. Lesquelles exactement?

Cela ne me ferait pas de mal d'essayer une pile SOAP différente, telle que CXF ou JAX-WS-RI, bien que cela m'ait surpris que l'un ou l'autre de ces deux logiciels prennent en charge Java 1.3.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top