Pregunta

Este problema me ha estado molestando durante días. Esperemos que alguien haya encontrado esto antes y haya desarrollado una solución.

Así que he desarrollado una aplicación Java de middleware que durante su ejecución invoca una acción SOAP. Ahora, el comportamiento de este bit de código bajo 1.6 JDK está funcionando 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);      

Sin embargo, cuando uso exactamente el mismo código en 1.3 o 1.4 JDK con las bibliotecas SOAP vinculadas, todo lo anterior funciona / compila / ejecuta, excepto por el hecho de que el campo SOAPAction del encabezado está en blanco . Por extraño que parezca, cuando verifico cuál es el valor de ese encabezado (las líneas inmediatamente después de configurar el encabezado) se muestra el valor apropiado. Sin embargo, cuando pasa por el cable, el campo está vacío. Como este es el campo que indica el recurso que quiero para el procesador, mis mensajes se devuelven en la puerta.

¿Alguien ha encontrado este problema antes? Si es así, ¿hay posibles soluciones? (Por supuesto, estoy dispuesto a usar otra biblioteca si es necesario).

UPDATE:

Las bibliotecas en mi classpath son las siguientes:

  • Xerces (resolver.jar, serializer.jar, xercesImpl.jar, xml-apis.jar)
  • Saaj (saaj.jar)
  • Eje (axis.jar
  • JAX-RPC (jaxrpc.jar)
  • SOAP estándar (activación.jar, mail.jar, soap.jar, xerces.jar)
  • Registro y descubrimiento de Commons

¡Gracias de antemano!

¿Fue útil?

Solución 2

Parece que esto en realidad puede ser un descuido o un error, pero en cualquier caso mi solución era manejar manualmente las cosas HTTP de nivel inferior, es decir:

        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;

Resulta que esto es significativamente más conciso que la solución basada en SOAP también.

Otros consejos

Peculiar. Dices que estás enlazando en las bibliotecas SOAP, ¿cuáles, exactamente?

No estaría de más probar una pila SOAP diferente, como CXF o JAX-WS-RI, aunque me sorprendería si alguno de los dos admitiera Java 1.3.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top