有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Creating SOAP Message:NAMESPACE\u ERR试图以不正确的方式创建或更改对象

我正在开发一个Web服务客户端,我需要生成如下代码:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="Envio_ConsultaSecuencia"> 
   <soapenv:Header/>
      <soapenv:Body>
        <env:envio> 
           <env:cabecera> 
               <env:idMensaje>ABCDEFG<env:idMensaje>             
               <env:tipoMensaje>ABCDEFG</env:tipoMensaje> 
           </env:cabecera> 
        </env:envio> 
     </soapenv:Body> 
</soapenv:Envelope>

所以,我的问题是当我试图在cabecera插入前缀“env”时。这是我正在使用的代码:

MessageFactory factory = MessageFactory.newInstance();
    SOAPMessage message = factory.createMessage();
    SOAPPart soapPart = message.getSOAPPart();
    SOAPEnvelope envelope = soapPart.getEnvelope();
    SOAPHeader header = envelope.getHeader();
    SOAPBody body = envelope.getBody();


    SOAPElement envio = body.addChildElement("envio");
    envio.setPrefix("env");


        SOAPElement cabecera = envio.addChildElement("cabecera");
        cabecera.setPrefix("env");
        (...)

我不明白为什么我可以在名为“envío”的SOAPElement中设置前缀“env”,当我尝试对“cabecera”进行相同设置时,我遇到了以下错误:

org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.

我会请求你的帮助。提前谢谢

编辑:

我在Oracle的web https://docs.oracle.com/cd/E19340-01/820-6767/aeqfx/index.html中找到了解决方案

创建每个子级的正确方法是:

Name bodyName = envelope.createName("GetLastTradePrice", "m",
                                       "http://eztrade.com")
SOAPBodyElement gltp = body.addBodyElement(bodyName);

插入前缀时不会出现问题

就这些


共 (1) 个答案

  1. # 1 楼答案

    尝试将命名空间声明添加到SOAPElement envio或SOAPEnvelope

            SOAPMessage message = factory.createMessage();
            SOAPPart soapPart = message.getSOAPPart();
            SOAPEnvelope envelope = soapPart.getEnvelope();
            //add declaration here
            envelope.addNamespaceDeclaration("env", "http://som.org");
            SOAPHeader header = envelope.getHeader();
            SOAPBody body = envelope.getBody();
    
    
            SOAPElement envio = body.addChildElement("envio");
            envio.setPrefix("env");
            //explicit declare it here for this element
            envio.addNamespaceDeclaration("env", "http://som.org");
            SOAPElement cabecera = envio.addChildElement("cabecera","env");