创建SOAP请求时与命名空间相关的错误

时间:2014-08-25 05:59:25

标签: java web-services dom xml-namespaces

我的尝试是从以下SOAPBody内容创建多个soap消息[只是一个样本,不是实际的]。每个EmpId都会有单独的请求。

<Request>
  <EMPId>?</EMPId>
</Request>

我使用以下代码将上述请求字符串转换为文档对象。

DocumentBuilder parser = factory.newDocumentBuilder();
            Document doc = parser.parse(new InputSource(new ByteArrayInputStream(xmlString.getBytes())));

一旦我有了文档,我就可以通过替换EMPId值来创建SOAPBody。

现在我必须为每个创建的SOAPBody创建单独的SOAPMessages。

为此,我使用以下代码。

private static String cretaeSOAPMessage(Document soapBodyDoc, String serverURI, String soapAction){
    String soapMsg = null;

    try {
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        SOAPPart soapPart = soapMessage.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("v1",serverURI);

        SOAPBody soapBody = envelope.getBody();

        soapBodyDoc.setPrefix("v1");
        soapBody.addDocument(soapBodyDoc);

        MimeHeaders headers = soapMessage.getMimeHeaders();
        headers.addHeader("SOAPAction", serverURI  + soapAction);

        soapMessage.saveChanges();

        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            soapMessage.writeTo(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
        soapMsg = new String(out.toByteArray());

    } catch (SOAPException e) {
        e.printStackTrace();
    }


    return soapMsg;
}

但是在执行包含内容的行时出现以下错误&#39; soapBodyDoc.setPrefix(&#34; v1&#34;); &#39;

  

线程中的异常&#34; main&#34; org.w3c.dom.DOMException:NAMESPACE_ERR:An   尝试以某种方式创建或更改对象   关于名称空间不正确。

我尝试在创建SOAPBody的地方添加命名空间prefic,即使该dint工作了。 如何避免此错误并将名称空间前缀添加到SOAPBody?

1 个答案:

答案 0 :(得分:0)

得到了解决。 名称空间声明将从信封中删除并添加到正文中。

   MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage soapMessage = messageFactory.createMessage();
    SOAPPart soapPart = soapMessage.getSOAPPart();
    SOAPEnvelope envelope = soapPart.getEnvelope();

    SOAPBody soapBody = envelope.getBody();


    soapBody.addDocument(soapBodyDoc);
    **soapBody.addNamespaceDeclaration("", serverURI);**

前缀被删除,因为原件没有任何前缀。