WebServiceTemplate:未在响应中声明sendsourceandreceivetoresult前缀

时间:2019-01-24 22:19:09

标签: java spring web-services soap spring-ws

我遇到错误:“未声明前缀'soapenv'的命名空间。”

我正在使用Spring的WebServiceTemplate发出请求,并使用此代码获取响应。

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代码解析响应删除该节点。

我该怎么做?这是最好的解决方案吗?

0 个答案:

没有答案