Spring webServiceTemplate:前缀“ soapenv”的命名空间尚未声明

时间:2018-12-18 11:19:50

标签: java xml spring web-services soap

我正在尝试使用以下代码发送SOAP请求:

        String strXML = new RegistroUnico().formarXML(unidad, codSIACI, solicitud, "entrada", usuario, pass);

        StreamSource source = new StreamSource(new StringReader(strXML));

        StreamResult result = new StreamResult(writer);

        webServiceTemplate.setDefaultUri(direccion);        

        //Enviamos y recibimos 
        webServiceTemplate.sendSourceAndReceiveToResult(direccion, source, result);

        StringBuffer sb = ((StringWriter) writer).getBuffer();
        String finalstring = sb.toString(); 

这是the formarXML(unidad, codSIACI, solicitud, "entrada", usuario, pass)函数:

private static final String CABECERA_ENTRADA = "<ws:RegistrarEntrada xmlns:ws=\"http://ws.rtaws.aapp.jccm.es\"> \n"
        + " <sUsuario>%s</sUsuario> \n"
        + " <sClave>%s</sClave> \n"
        + " <strXML> \n" + " <![CDATA[\n";
private static final String PIE_ENTRADA = "\n]]> \n" + " </strXML> \n"
        + " </ws:RegistrarEntrada>";

private static final String CABECERA_SALIDA = "<ws:RegistrarSalida xmlns:ws=\"http://ws.rtaws.aapp.jccm.es\"> \n"
        + " <sUsuario>%s</sUsuario> \n"
        + " <sClave>%s</sClave> \n"
        + " <strXML> \n" + " <![CDATA[\n";
private static final String PIE_SALIDA = "\n]]> \n" + " </strXML> \n"
        + " </ws:RegistrarSalida>";

public RegistroUnico() {
}

public String formarXML(String unidad, String codigo, SolicitudRegistro unaSolicitud, String tipoRegistro, String usuario, String pass) throws Exception {
    String xmlString = "";
    try {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        DOMImplementation implementation = builder.getDOMImplementation();

        Document doc = implementation.createDocument(null, "xml", null);

        // Creamos el primer elemento (etiqueta) del XML
        Element Datos = doc.createElement("Datos");
        // Unimos el elemento a la raiz del documento
        doc.getDocumentElement().appendChild(Datos);

        // Creamos los 6 primeros nodos
        Element AcuseRecibo = doc.createElement("AcuseRecibo");
        // solo para las salidas
        Element CodRegEnt = doc.createElement("CodRegEnt");
        Element EjercicioRegEnt = doc.createElement("EjercicioRegEnt");
        Element CodUniOrgOrig = doc.createElement("CodUniOrgOrig");
        //
        Element CodSIACI = doc.createElement("CodSIACI");
        Element CodUniOrgDest = doc.createElement("CodUniOrgDest");
        Element Observaciones = doc.createElement("Observaciones");
        Element ExisteRep = doc.createElement("ExisteRep");
        Element Interesado = doc.createElement("Interesado");

        // Creamos los valores que van dentro de los 6 primeros nodos
        Text textAcuseRecibo = doc.createTextNode("N");
        // solo para las salidas
        Text textCodRegEnt = doc.createTextNode("");// doc.createTextNode(unaSolicitud.getNumeroRegistro());

        Text textEjercicioRegEnt=doc.createTextNode("");

        Text textCodUniOrgOrig = doc.createTextNode(unidad);

        Text textCodSIACI = doc.createTextNode(codigo);
        Text textCodUniOrgDest = doc.createTextNode(unidad);

        Text textObservaciones = doc.createTextNode(unaSolicitud.getObservaciones());
        Text textExisteRep = doc.createTextNode("N");

        // a�adimos los 6 primeros nodos
        Datos.appendChild(AcuseRecibo);
        if (tipoRegistro.equals("salida")) {
            Datos.appendChild(CodRegEnt);
            Datos.appendChild(EjercicioRegEnt);
        }
        Datos.appendChild(CodSIACI);
        if (tipoRegistro.equals("salida")) {
            Datos.appendChild(CodUniOrgOrig);
        } else {
            Datos.appendChild(CodUniOrgDest);
        }
        Datos.appendChild(Observaciones);
        Datos.appendChild(ExisteRep);
        Datos.appendChild(Interesado);

        // a�aadimos los valores de los 6 primeros nodos
        AcuseRecibo.appendChild(textAcuseRecibo);
        if (tipoRegistro.equals("salida")) {
            CodRegEnt.appendChild(textCodRegEnt);
            EjercicioRegEnt.appendChild(textEjercicioRegEnt);
        }
        CodSIACI.appendChild(textCodSIACI);
        if (tipoRegistro.equals("salida")) {
            CodUniOrgOrig.appendChild(textCodUniOrgOrig);
        } else {
            CodUniOrgDest.appendChild(textCodUniOrgDest);
        }
        Observaciones.appendChild(textObservaciones);
        ExisteRep.appendChild(textExisteRep);

        // Creamos los elementos que van dentro de interesado
        Element TipoDoc = doc.createElement("Int_TipoDoc");
        Element NifCif = doc.createElement("Int_NifCif");
        Element Nombre = doc.createElement("Int_Nombre");
        Element PrimerAp = doc.createElement("Int_PrimerAp");
        Element SegundoAp = doc.createElement("Int_SegundoAp");

        // valores de las variables
        String tipoDoc = unaSolicitud.getInteresado().getTipoDoc();
        String numIdentificador = "";
        //Issue #11672
        numIdentificador = unaSolicitud.getInteresado().getNifCif();

        String apellido1 = unaSolicitud.getInteresado().getPrimerAp();


        if (apellido1.length() > 30) {
            apellido1 = apellido1.substring(0, 29);
        }
        String apellido2 = unaSolicitud.getInteresado().getSegundoAp();

        if(apellido2!=null){
            if (apellido2.length() > 30) {
                apellido2 = apellido2.substring(0, 29);
            }
        }else{
            apellido2 ="";
        }

        // Creamos los valores que van dentro de interesado
        Text textTipoDoc = doc.createTextNode(tipoDoc);
        Text textNifCif = doc.createTextNode(numIdentificador);
        Text textNombre = doc.createTextNode(unaSolicitud.getInteresado()
                .getNombre());
        Text textPrimerAp = doc.createTextNode(apellido1);
        Text textSegundoAp = doc.createTextNode(apellido2);

        Interesado.appendChild(TipoDoc);
        Interesado.appendChild(NifCif);
        Interesado.appendChild(Nombre);
        Interesado.appendChild(PrimerAp);
        Interesado.appendChild(SegundoAp);

        TipoDoc.appendChild(textTipoDoc);
        NifCif.appendChild(textNifCif);
        Nombre.appendChild(textNombre);
        PrimerAp.appendChild(textPrimerAp);
        SegundoAp.appendChild(textSegundoAp);

        // a�adimos el �ltimo valor
        Element NumDocumentos = doc.createElement("NumDocumentos");
        Text textNumDocumentos = doc.createTextNode("0");
        Datos.appendChild(NumDocumentos);
        NumDocumentos.appendChild(textNumDocumentos);

        // cargamos el xml en una variable de tipo string
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StreamResult result = new StreamResult(new StringWriter());
        DOMSource source = new DOMSource(doc);
        transformer.transform(source, result);
        xmlString = result.getWriter().toString();
        // Quitamos Etiquetas XML
        xmlString = xmlString.substring(54);
        xmlString = xmlString.replace("<xml>", "");
        xmlString = xmlString.replace("</xml>", "");
        xmlString = xmlString.trim();

        // A�adimos cabeceras-Acci�n
        if (tipoRegistro.equals("salida")) {
            String cabecera = String.format(CABECERA_SALIDA,  usuario, pass);
            xmlString = cabecera + xmlString + PIE_SALIDA;
        }
        else{
            String cabecera = String.format(CABECERA_ENTRADA, usuario, pass);
            xmlString = cabecera + xmlString + PIE_ENTRADA;
        }   

    } catch (Exception e) {
        System.err.println("Error en el almacenamiento del XML: "
                + e.getMessage());
    }


    return xmlString;
}

当代码到达webServiceTemplate.sendSourceAndReceiveToResult(direccion, source, result);时,我会在日志中得到此信息:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header/><env:Body><ws:RegistrarEntrada xmlns:ws="http://ws.rtaws.aapp.jccm.es"> 
 <sUsuario>user</sUsuario> 
 <sClave>pass</sClave> 
 <strXML> 

&lt;Datos&gt;
&lt;AcuseRecibo&gt;N&lt;/AcuseRecibo&gt;
&lt;CodSIACI&gt;SJT3&lt;/CodSIACI&gt;
&lt;CodUniOrgDest&gt;850&lt;/CodUniOrgDest&gt;
&lt;Observaciones&gt;Registro de Solicitud Bolsa del SESCAM.&lt;/Observaciones&gt;
&lt;ExisteRep&gt;N&lt;/ExisteRep&gt;
&lt;Interesado&gt;
&lt;Int_TipoDoc&gt;N&lt;/Int_TipoDoc&gt;
&lt;Int_NifCif&gt;111111112&lt;/Int_NifCif&gt;
&lt;Int_Nombre&gt;GONZALO&lt;/Int_Nombre&gt;
&lt;Int_PrimerAp&gt;DE SANTIAGO&lt;/Int_PrimerAp&gt;
&lt;Int_SegundoAp&gt;PEREZ&lt;/Int_SegundoAp&gt;
&lt;/Interesado&gt;
&lt;NumDocumentos&gt;0&lt;/NumDocumentos&gt;
&lt;/Datos&gt;

 </strXML> 
 </ws:RegistrarEntrada></env:Body></env:Envelope>]
 00:34:57,408 DEBUG received:706 - Received response [<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:RegistrarEntradaResponse xmlns:ns1="http://ws.rtaws.aapp.jccm.es" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><RegistrarEntradaReturn xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="soapenc:string">&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;&lt;RTA-JCCM&gt;&lt;resultado&gt;0&lt;/resultado&gt;&lt;numRegElectronico&gt;20640&lt;/numRegElectronico&gt;&lt;cve&gt;RU0476988435451213036CFRBGRFRCPR&lt;/cve&gt;&lt;fecha&gt;21/12/2018 00:34:56&lt;/fecha&gt;&lt;/RTA-JCCM&gt;</RegistrarEntradaReturn></ns1:RegistrarEntradaResponse></soapenv:Body></soapenv:Envelope>] for request [<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header/><env:Body><ws:RegistrarEntrada xmlns:ws="http://ws.rtaws.aapp.jccm.es"> 
 <sUsuario>user</sUsuario> 
 <sClave>pass</sClave> 
 <strXML> 

&lt;Datos&gt;
&lt;AcuseRecibo&gt;N&lt;/AcuseRecibo&gt;
&lt;CodSIACI&gt;SJT3&lt;/CodSIACI&gt;
&lt;CodUniOrgDest&gt;850&lt;/CodUniOrgDest&gt;
&lt;Observaciones&gt;Registro de Solicitud Bolsa del SESCAM.&lt;/Observaciones&gt;
&lt;ExisteRep&gt;N&lt;/ExisteRep&gt;
&lt;Interesado&gt;
&lt;Int_TipoDoc&gt;N&lt;/Int_TipoDoc&gt;
&lt;Int_NifCif&gt;111111112&lt;/Int_NifCif&gt;
&lt;Int_Nombre&gt;GONZALO&lt;/Int_Nombre&gt;
&lt;Int_PrimerAp&gt;DE SANTIAGO&lt;/Int_PrimerAp&gt;
&lt;Int_SegundoAp&gt;PEREZ&lt;/Int_SegundoAp&gt;
&lt;/Interesado&gt;
&lt;NumDocumentos&gt;0&lt;/NumDocumentos&gt;
&lt;/Datos&gt;

 </strXML> 
 </ws:RegistrarEntrada></env:Body></env:Envelope>]

错误:前缀'soapenv'的名称空间尚未声明。'

我已经在SoapUI中测试了请求,结果还可以,所以我想错误应该出在Java代码中,也许在文档创建中? 有人可以帮我吗?

0 个答案:

没有答案