WebServiceTemplate: отправляет префикс исходного и полученного результата, не объявленный в ответе - PullRequest
0 голосов
/ 25 января 2019

У меня ОШИБКА: 'Пространство имен для префикса' soapenv 'не объявлено.' в ответе на вызов веб-службы.

Я использую SpringServiceTemplate, чтобы сделать запрос и получить ответ с этим кодом.

public String getRegistroUnico() {

    String       xmlRequest = this.getPeticion();
    StreamSource peticion   = new StreamSource(new StringReader(xmlRequest));
    DOMResult    respuesta  = new DOMResult();
    String numeroRU = null;

    boolean hayRespuesta = webServiceTemplate.sendSourceAndReceiveToResult(URI, peticion, respuesta);
    if (hayRespuesta){
        numeroRU = this.resultToRegistroUnico((Document) respuesta.getNode());
    }
    return numeroRU;
}

/**
 * @return Genera la petición (payload) que se enviará al servicio Web
 */
private String getPeticion(){
    StringBuffer buffer = new StringBuffer(1024);
    buffer.append("<ws:RegistrarEntrada xmlns:ws=\"http://ws.rtaws.rtaws.jccm.es\"> ");
    buffer.append("<sUsuario>user</sUsuario>");
    buffer.append("<sClave>pass</sClave>");
    buffer.append("<strXML>");

    buffer.append("&lt;Datos&gt;DATA&lt;/Datos&gt;");

    buffer.append("</strXML>");
    buffer.append("</ws:RegistrarEntrada>");
    return buffer.toString();
}

/**
 * @return Devuelve una lista de Libro a partir del DOM
 */
private String resultToRegistroUnico(Document doc){
    NodeList nodos   = doc.getFirstChild().getChildNodes();
    Node     current = null;
    String numeroRU = null;
    for (int i = 0, num = nodos.getLength(); i < num; i++){
        current = nodos.item(i);

        System.out.println(current);

    }

    return numeroRU;
}

Я собрал данные с помощью WireShark, и это результат.

Запрос (wireshark)

<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header/>
<env:Body>
<ws:RegistrarEntrada xmlns:ws="http://ws.rtaws.rtaws.jccm.es"> 
    <sUsuario>user</sUsuario>
    <sClave>pass</sClave>
    <strXML>
    &lt;Datos&gt;DATA&lt;/Datos&gt;
    </strXML>
</ws:RegistrarEntrada>
</env:Body>
</env:Envelope>

Ответ (wireshark)

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <soapenv:Body>
     <ns1:RegistrarEntradaResponse soapenv:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:ns1="http://ws.rtaws.rtaws.jccm.es">
     <ns2:result xmlns:ns2="http://www.w3.org/2003/05/soap-rpc">RegistrarEntradaReturn</ns2:result>
     <RegistrarEntradaReturn xsi:type="ns3:string" xmlns:ns3="http://schemas.xmlsoap.org/soap/encoding/">
        &lt;?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot;?&gt;&lt;RTA-JCCM&gt;&lt;/RTA-JCCM&gt;
     </RegistrarEntradaReturn>
     </ns1:RegistrarEntradaResponse>
 </soapenv:Body>
</soapenv:Envelope>

Ответ, выполняющий тот же запрос на SoapUI, совершенно другой

enter image description here

Как вы можете видеть на изображении, в ответе java-кода добавляется строка <ns2:result xmlns:ns2="http://www.w3.org/2003/05/soap-rpc">RegistrarEntradaReturn</ns2:result>, как вы можете видеть в ответе wireshark, поэтому я думаю, что решение может состоять в том, чтобы проанализировать ответ в java-коде для удаления этот узел.

Как я могу это сделать? Это лучшее решение?

...