Foro sobre Java SE > Java, comunicacion
Ese valor "key", no veo dónde se inicializa.
Tal vez esa sea la causa del resultado null.
Se inicializa aquí:
class TcAdsSOAP
{
private String soapTargetUrl;
private final String soap_read= "\"http://beckhoff/action/TcAdsSync.Read\"";
private final String soap_write= "http://beckhoff.org/action/TcAdsSync.Write";
private Exception error;
public String key = "ppData";
Hay algo extraño en ese método.
De entrada, no veo que en el message response te aparezca ese valor "ppData" en ningún sitio.
¿El substring no te dará un IndexOutOfBoundsException?. ¿Podrías comprobarlo, en vez de reenviar la excepción?
No me da esa excepción,
lo siento pero no se como podría comprobarlo¿?
Prueba a declarar el método de esta manera.
De todos modos, la única excepción que lanza substring es ésa. Lo que no me queda nada claro es el significado de ese key. Da la impresión de que se quiere comprobar que el key se encuentra en el message response (lo que parece lógico); pero a key debería asignársele un valor "esperado". ¿Estás seguro de que el valor de key deba ser "ppData"?. Estoy casi seguro de que ese método lanza la excepción, porque no me explico entonces que devuelva un null.
private String parseSOAPString(String SOAPMessage) {
try {
return SOAPMessage.substring(SOAPMessage.indexOf(key, 0) + key.length() + 1, SOAPMessage.lastIndexOf(key) - 2);;
} catch (IndexOutOfBoundsException e) {
System.out.println("error "+e.getCause());
error = new Exception("Unknown answer from WebService");
}
}
Para poder compilarlo necesito hacerlo de esta manera si no me da error por el return.
private String parseSOAPString(String SOAPMessage)
{
return SOAPMessage.substring(SOAPMessage.indexOf(key, 0) + key.length() + 1, SOAPMessage.lastIndexOf(key) - 2);
}
Y ahora si me lanza el siguiente error:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -9
at java.lang.String.substring(String.java:1958)
at ADS_communication.TcAdsSOAP.parseSOAPString(TcAdsSOAP.java:319)
at ADS_communication.TcAdsSOAP.SOAPCall(TcAdsSOAP.java:263)
at ADS_communication.TcAdsSOAP.SOAPCall(TcAdsSOAP.java:199)
at ADS_communication.TcAdsSOAP.ReadBool(TcAdsSOAP.java:43)
at ADS_communication.AdSWebServiceSample.main(AdSWebServiceSample.java:18)
Java Result: 1
La linea 1958 es la siguiente:
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
y el código este, el cual no puedo reescribir porque es privado
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
Ya parece claro que o bien el valor asignado a key no es el correcto, o la respuesta SOAP no es la que debería ser.
Ya ves que lanza la excepción porque la asignación de índices al substring es incorrecta, y es debido a que no "encuentra" el valor de key dentro del message response.
Si ese es el contenido.
Y esta es la clase:
private String parseSOAPString(String SOAPMessage)
{
try
{
SOAPMessage = SOAPMessage.substring(SOAPMessage.indexOf(key,0)+key.length()+1,SOAPMessage.lastIndexOf(key)-2);
return SOAPMessage;
}
catch(Exception e)
{
error=new Exception("Unknown answer from WebService");
return null;
}
}