Java - 错误非默认命名空间无法映射到XML 1.0文档中的空URI

时间:2014-11-26 11:30:41

标签: java xml soap

我尝试用Java调用web服务。主要是我遵循这个link并且我解决了谷歌和stackoverflow的其他问题的几个问题。但是,我收到一个我无法解决的错误:

Exception in thread "main" javax.xml.ws.WebServiceException: javax.xml.stream.XMLStreamException: Non-default namespace can not map to empty URI (as per Namespace 1.0 # 2) in XML 1.0 documents

我认为问题出在我创建的xml中,但我看得很清楚。

SOAPUI请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acc="http://url/acceso">
   <soapenv:Header/>
   <soapenv:Body>
      <acc:petitionSession>
         <acc:codUser/>
         <acc:pass>?</acc:pass>
         <acc:codOp>?</acc:codOp>
      </acc:petitionSession>
   </soapenv:Body>
</soapenv:Envelope>

请求我生成:

   <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:acc="http://url/acceso">
    <SOAP-ENV:Header/>
        <SOAP-ENV:Body>
            <acc:petitionSession>
                <acc:codUser/>
                <acc:pass>user1</acc:pass>
                <acc:codOp>Temp1</acc:codOp>
            </acc:petitionSession>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

代码:

Dispatch dispatcher = getDispatcher(wsdlLocation,namespace,serviceName,portName);

dispatcher.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
dispatcher.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, soapActionUri);

... ...

 public static SOAPMessage construirMensaje() throws SOAPException, IOException{

        MessageFactory factory = MessageFactory.newInstance();
         SOAPMessage soapMsg = factory.createMessage();
         SOAPPart part = soapMsg.getSOAPPart();

         SOAPEnvelope envelope = part.getEnvelope();
         envelope.addNamespaceDeclaration("acc", "http://url/acceso");
         SOAPHeader header = envelope.getHeader();
         SOAPBody body = envelope.getBody();

         SOAPBodyElement element = body.addBodyElement(envelope.createName("petitionSession", 
                 "acc", null));
         element.addChildElement(body.addBodyElement(envelope.createName("codUser", 
                 "acc", null)));

         SOAPBodyElement pass = body.addBodyElement(envelope.createName("pass", 
                 "acc", null));
         pass.addTextNode("user1");
         element.addChildElement(pass);

         SOAPBodyElement codOp = body.addBodyElement(envelope.createName("codOp", 
                 "acc", null));
         codOp.addTextNode("Temp1");
         element.addChildElement(codOp);

         soapMsg.writeTo(System.out);

         FileOutputStream fOut = new FileOutputStream("SoapMessage.xml");
         soapMsg.writeTo(fOut);

         System.out.println();

         return soapMsg;

    }

有什么想法吗?

问候。

1 个答案:

答案 0 :(得分:0)

我发现标题中的问题是它没有很好地构建。它需要添加:

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