Java soap xml中缺少结束标记

时间:2019-05-28 14:02:41

标签: java xml soap namespaces

我正在尝试用Java构建xml soap响应。 消息的每个部分都可以,但缺少结束标记     

我在google上搜索了一些书籍,所有书籍都以与我相同的方式来构建消息。但是在我的留言中     标签没有出现

在我的代码下面:

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    documentBuilderFactory.setNamespaceAware(true);
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    Document mensajeNoFirmado3A = documentBuilder.newDocument();

    Element DestinatarioACHElement = mensajeNoFirmado3A.createElement("Destinatario_ACH");
    Element numOrdenOrgiginateElement = mensajeNoFirmado3A.createElement("num_orden_originante");
    numOrdenOrgiginateElement.setTextContent(mensaje2A.getNum_orden_originante());

    DestinatarioACHElement.appendChild(numOrdenOrgiginateElement);

    Element numOrdenAchElement = mensajeNoFirmado3A.createElement("num_orden_ach");
    numOrdenAchElement.setTextContent(mensaje2A.getNum_orden_ach());
    DestinatarioACHElement.appendChild(numOrdenAchElement);

    Element tipoOrdenElement = mensajeNoFirmado3A.createElement("tip_orden");
    tipoOrdenElement.setTextContent("250");
    DestinatarioACHElement.appendChild(tipoOrdenElement);

    Element codSucursalDestinatarioElement = mensajeNoFirmado3A.createElement("cod_sucursal_destinatario");
    codSucursalDestinatarioElement.setTextContent(mensaje2A.getCod_sucursal_destinatario());
    DestinatarioACHElement.appendChild(codSucursalDestinatarioElement);

    Element codPaisDestinatarioElement = mensajeNoFirmado3A.createElement("cod_pais_destinatario");
    codPaisDestinatarioElement.setTextContent(mensaje2A.getCod_pais_destinatario());
    DestinatarioACHElement.appendChild(codPaisDestinatarioElement);

    Element codRespuestaElement = mensajeNoFirmado3A.createElement("cod_respuesta");


    ...........................................


    codRespuestaElement.setTextContent(codRespuesta);
    DestinatarioACHElement.appendChild(codRespuestaElement);

    Element numOrdenDestElement = mensajeNoFirmado3A.createElement("num_orden_destinatario");


    ............................................


    DestinatarioACHElement.appendChild(numOrdenDestElement);
    Element titularDestinatarioElement = mensajeNoFirmado3A.createElement("titular_destinatario");

    if(isClienteBanco.get()){
        if ("CONFIRMACION DE APLICACION".equals(respuestaAbono.getEstado())) {
            titularDestinatarioElement.setTextContent(nombreCliente);
        } else{
            titularDestinatarioElement.setTextContent("XXX");
        }
    }
    else {
        titularDestinatarioElement.setTextContent("XXX");
    }

    DestinatarioACHElement.appendChild(titularDestinatarioElement);

    ....................

    mensajeNoFirmado3A.appendChild(DestinatarioACHElement);
    KeysFromPKCS12 keysFromPKCS12 = new KeysFromPKCS12(connections,parameterService);
    IKeys.KeyAndCert keyAndCert = keysFromPKCS12.getKeyAndCert();

    PrivateKey key = keyAndCert.getKey();
    document = documentBuilderFactory.newDocumentBuilder().newDocument();
    String keyname = parameterService.valueOf(XXXXXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXX);
    //Node importedNode = document.importNode(mensajeNoFirmado3A.getDocumentElement(), true);
    //document.appendChild(importedNode);
    LOGGER.info("Firmamos el mensaje 3A...");
    XMLSigner.sign(document, null, document.importNode(mensajeNoFirmado3A.getDocumentElement(), true), key, keyname);

    try
    {
        MessageFactory mfactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = mfactory.createMessage();

        SOAPPart soapPart = soapMessage.getSOAPPart();

        SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
        soapEnvelope.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema");
        soapEnvelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");

        SOAPHeader soapHeader = soapEnvelope.getHeader();
        soapHeader.detachNode();

        SOAPBody soapBody = soapEnvelope.getBody();
        ////////soapBody = soapMessage.getSOAPBody();

        SOAPFactory soapFactory = SOAPFactory.newInstance();
        Name bodyName  = soapFactory.createName("receptorExpressResponse", "ns1", "http://tempuri.org/");
        //Name encName = soapFactory.createName("SOAP-ENV:encodingStyle");

        //SOAPBodyElement sbe = soapBody.addBodyElement(bodyName);
        //SOAPElement childElement = soapBody.addChildElement("receptorExpressResponse", "ns1");
        //sbe.addAttribute(encName, "http://schemas.xmlsoap.org/soap/encoding/");
        //
        SOAPElement child = soapBody.addBodyElement(bodyName);
        child.addNamespaceDeclaration("ns1", "http://tempuri.org/");
        child.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");



        soapBody.addDocument(document);

        soapMessage.saveChanges();

        LOGGER.info("Envelope added");  
        LOGGER.info("SOAPMessage {}", soapMessage);

        document = toDocument(soapMessage);

        String soapMessageStr = soapMessageToString(soapMessage);

我得到的xml如下:

<SOAP-ENV:Envelope xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

........................


</ds:Signature>

</SOAP-ENV:Body>
</SOAP-ENV:Envelope>"

但是我希望这样:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

 ..............................

</ds:Signature>
</ns1: receptorExpressResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

您可以看到我的回复中缺少“ / ns1:receptorExpressResponse”。

请有人帮助我会很感激

感谢Yuan的最终版本:

try
    {
        MessageFactory mfactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = mfactory.createMessage();

        SOAPPart soapPart = soapMessage.getSOAPPart();

        SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
        soapEnvelope.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema");
        soapEnvelope.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");

        SOAPHeader soapHeader = soapEnvelope.getHeader();
        soapHeader.detachNode();

        SOAPBody soapBody = soapEnvelope.getBody();

        SOAPFactory soapFactory = SOAPFactory.newInstance();
        Name bodyName  = soapFactory.createName("receptorExpressResponse", "ns1", "http://tempuri.org/");

        SOAPElement child = soapBody.addBodyElement(bodyName);
        child.addNamespaceDeclaration("ns1", "http://tempuri.org/");
        child.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");

        Document childDoc = child.getOwnerDocument();
        Node signDocumentNode = childDoc.importNode(document.getFirstChild(), true);
        child.appendChild(signDocumentNode);
        soapMessage.saveChanges();

        LOGGER.info("Envelope added");  
        LOGGER.info("SOAPMessage {}", soapMessage);

        document = toDocument(soapMessage);

        String soapMessageStr = soapMessageToString(soapMessage);

        LOGGER.info("SOAPMessageStr {}", soapMessageStr);
        LOGGER.info("Devolviendo Simple 3A");
        salida = nodeToString(document);
        LOGGER.info("Salida " + salida);
    } catch (SAXException e) {
        e.printStackTrace();
        LOGGER.info("SAXException {}", e);
    } catch(SOAPException ex) {
        ex.printStackTrace();
        LOGGER.info("SOPAException {}", ex);
    } catch (IOException e) {
        e.printStackTrace();
        LOGGER.info("IOException {}", e);
    }

1 个答案:

答案 0 :(得分:1)

您的输出正确。

<ns1:receptorExpressResponse xmlns:ns1="http://tempuri.org/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

您看到最后一个/吗?这表示此xml元素已完成。

因此,您的问题是使其他元素成为该元素的子元素(receptorExpressResponse)