Проблема SoapAction в Java 1.3
-
20-08-2019 - |
Вопрос
Эта проблема беспокоит меня уже несколько дней.Надеюсь, кто-то сталкивался с этим раньше и разработал обходной путь.
Поэтому я разработал 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, сериализатор.jar, xercesImpl.jar, xml-apis.jar)
- Саадж (saaj.jar)
- Ось (axis.jar
- JAX-RPC (jaxrpc.jar)
- Стандартный SOAP (activation.jar, mail.jar, Soap.jar, xerces.jar)
- Регистрация и обнаружение Commons
Заранее спасибо!
Решение 2
Похоже, что на самом деле это может быть недосмотром или ошибкой, но в любом случае мой обходной путь заключался в ручной обработке 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.
Другие советы
Своеобразный.Вы говорите, что подключаете библиотеки SOAP - какие именно?
Мне бы не мешало попробовать другой стек SOAP, например CXF или JAX-WS-RI, хотя я был бы удивлен, если бы какой-либо из этих двух поддерживал Java 1.3.