Edição SoapAction sob Java 1.3
-
20-08-2019 - |
Pergunta
Este problema foi me incomodando há dias. Esperemos que alguém se deparou com isso antes e desenvolveu uma solução alternativa.
Então, eu desenvolvi um aplicativo Java middleware que durante sua execução invoca uma ação SOAP. Agora, o comportamento desse trecho de código sob a 1,6 JDK está funcionando bem:
// 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);
No entanto, quando eu uso este exatamente o mesmo código sob 1.3 ou 1.4 JDK com as bibliotecas de SOAP ligados, tudo acima obras / compila / executa, exceto pelo fato de que o campo SOAPAction do cabeçalho está em branco . Estranhamente, quando eu verificar que o valor desse cabeçalho é (as linhas imediatamente após a criação do cabeçalho) o valor apropriado é exibido. No entanto, quando ele passa sobre o fio, o campo estiver vazio. Como este é o campo que indica o recurso que eu quero para o processador, minhas mensagens estão se voltou para a porta.
Alguém já encontrou este problema antes? Se assim for, existem soluções possíveis? (Eu sou, naturalmente, dispostos a usar outra biblioteca, se necessário.)
UPDATE:
As bibliotecas no meu classpath são as seguintes:
- Xerces (resolver.jar, serializer.jar, xercesImpl.jar, xml-apis.jar)
- Saaj (saaj.jar)
- Axis (axis.jar
- JAX-RPC (jaxrpc.jar)
- padrão SOAP (activation.jar, mail.jar, soap.jar, xerces.jar)
- Commons registro e descoberta ??li>
Agradecemos antecipadamente!
Solução 2
Parece que este pode realmente ser um descuido ou um bug, mas de qualquer forma a minha solução era para lidar com as coisas HTTP de nível inferior manualmente, ou seja:.
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;
Acontece que este é significativamente mais concisa do que a solução baseados em SOAP também.
Outras dicas
Peculiar. Você diz que está ligando nas bibliotecas sabão -? Quais, exatamente
Eu não faria mal tentar uma pilha de SOAP diferente, como CXF ou JAX-WS-RI, embora eu tivesse surpreendido se qualquer um dos dois java 1.3 suportado.