Проблема с SoapAction под Java 1.3 - PullRequest
0 голосов
/ 26 июня 2009

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

Итак, я разработал промежуточное 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 заголовка пусто, Как ни странно, когда я проверяю, какое значение у этого заголовка (строки, следующие сразу за настройкой заголовка), отображается соответствующее значение. Однако, когда это идет по проводу, поле пусто. Так как это поле указывает на ресурс, который я хочу обработчику, мои сообщения возвращаются обратно к двери.

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

UPDATE:

Библиотеки на моем пути к классам:

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

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

Ответы [ 2 ]

0 голосов
/ 26 июня 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.

0 голосов
/ 26 июня 2009

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

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

...