Domanda

Questo problema mi ha infastidito per giorni. Spero che qualcuno l'abbia già scoperto e abbia sviluppato una soluzione alternativa.

Quindi ho sviluppato un'app Java middleware che durante la sua esecuzione invoca un'azione SOAP. Ora, il comportamento di questo bit di codice in 1.6 JDK funziona bene:

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

Tuttavia, quando utilizzo esattamente lo stesso codice in 1.3 o 1.4 JDK con le librerie SOAP collegate, tutto quanto sopra funziona / compila / esegue, tranne per il fatto che il campo SOAPAction dell'intestazione è vuoto . Stranamente, quando controllo qual è il valore di quell'intestazione (le righe immediatamente successive alla configurazione dell'intestazione) viene visualizzato il valore appropriato. Tuttavia, quando passa sopra il filo, il campo è vuoto. Poiché questo è il campo che indica la risorsa che desidero per il processore, i miei messaggi vengono restituiti alla porta.

Qualcuno ha riscontrato questo problema prima? In tal caso, ci sono possibili soluzioni alternative? (Ovviamente, sono disposto a utilizzare un'altra libreria, se necessario.)

UPDATE:

Le librerie sul mio percorso di classe sono le seguenti:

  • Xerces (resolver.jar, serializer.jar, xercesImpl.jar, xml-apis.jar)
  • Saaj (saaj.jar)
  • Axis (axis.jar
  • JAX-RPC (jaxrpc.jar)
  • SOAP standard (Activation.jar, mail.jar, soap.jar, xerces.jar)
  • Registrazione e rilevamento di Commons

Grazie in anticipo!

È stato utile?

Soluzione 2

Sembra che questo possa effettivamente essere una svista o un bug, ma in ogni caso la mia soluzione era quella di gestire manualmente le cose HTTP di livello inferiore, cioè:

        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;

Si scopre che questo è significativamente più conciso rispetto alla soluzione basata su SOAP.

Altri suggerimenti

Peculiar. Dici che stai collegando nelle librerie SOAP - quali, esattamente?

Non mi farebbe male provare un diverso stack SOAP, come CXF o JAX-WS-RI, anche se mi sarei sorpreso se uno di questi due supportasse java 1.3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top