Проблема SoapAction в Java 1.3

Эта проблема беспокоит меня уже несколько дней. Надеюсь, кто-то сталкивался с этим раньше и разработал обходной путь.

Итак, я разработал промежуточное Java-приложение, которое во время выполнения вызывает действие SOAP. Теперь поведение этого фрагмента кода в JDK 1.6 работает хорошо:

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

Однако, когда я использую точно такой же код в JDK 1.3 или 1.4 со связанными библиотеками SOAP, все вышеперечисленное работает/компилируется/выполняется, за исключением того факта, что поле заголовка SOAPAction пусто. Как ни странно, когда я проверяю значение этого заголовка (строки сразу после настройки заголовка), отображается соответствующее значение. Однако, когда он проходит по проводу, поле остается пустым. Поскольку это поле указывает процессору ресурс, который мне нужен, мои сообщения возвращаются обратно к двери.

Кто-нибудь сталкивался с этой проблемой раньше? Если да, то есть ли возможные обходные пути? (Я, конечно, готов использовать другую библиотеку, если потребуется.)

ОБНОВЛЕНИЕ:

Библиотеки в моем пути к классам следующие:

  • Xerces (resolver.jar, serializer.jar, xercesImpl.jar, xml-apis.jar)
  • Саадж (saaj.jar)
  • Ось (axis.jar
  • JAX-RPC (jaxrpc.jar)
  • Стандартный SOAP (activation.jar, mail.jar, soap.jar, xerces.jar)
  • Регистрация и обнаружение Commons

Заранее спасибо!


person Joseph Weissman    schedule 25.06.2009    source источник


Ответы (2)


Своеобразный. Вы говорите, что линкуете библиотеки SOAP — какие именно?

Мне не мешало бы попробовать другой стек SOAP, такой как CXF или JAX-WS-RI, хотя я был бы удивлен, если бы какой-либо из этих двух поддерживал java 1.3.

person skaffman    schedule 25.06.2009
comment
Спасибо. Попробую JAX-WS-RI. Также добавил библиотеки в начальный пост. - person Joseph Weissman; 26.06.2009

Похоже, что на самом деле это может быть оплошность или ошибка, но в любом случае мой обходной путь заключался в том, чтобы вручную обрабатывать низкоуровневый материал HTTP, то есть:

        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;

Оказывается, это также значительно более лаконично, чем решение на основе SOAP.

person Joseph Weissman    schedule 26.06.2009