Java - 从String XML Envelope中使用SOAP Web服务

时间:2013-04-16 17:06:54

标签: java xml web-services soap envelope

使用SoapUI我已经构建了以下XML包络并将其封装在String中。

ProcessJournal是一个没有参数的方法,并返回一个字符串。

String soapText = "<Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:upd=\"http://webservices.vm.vmc/UpdateCMA/\">" +
                    "<Header/>" +
                     "<Body>" +
                       "<upd:ProcessJournal/>" +
                     "</Body>" +
                  "</Envelope>";

现在......我只是想调用上面定义的Web服务。并且已经找到了一些示例代码

                // Create SoapMessage
                MessageFactory msgFactory     = MessageFactory.newInstance();
                SOAPMessage message           = msgFactory.createMessage();
                SOAPPart soapPart             = message.getSOAPPart();

                // Load the SOAP text into a stream source
                byte[] buffer                 = soapText.getBytes();
                ByteArrayInputStream stream   = new ByteArrayInputStream(buffer);
                StreamSource source           = new StreamSource(stream);

                // Set contents of message 
                soapPart.setContent(source);

                // -- DONE
                message.writeTo(System.out);


                //Try accessing the SOAPBody
                SOAPBody soapBody = message.getSOAPBody();

问题是,在message.getSOAPBody();,我收到错误

XML-22103: (Fatal Error) DOMResult can not be this kind of node.
Apr 16, 2013 12:05:06 PM com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
SEVERE: SAAJ0511: Unable to create envelope from given source

我找到的所有各种样本,在执行getSOAPBody()时都会出现相同类型的错误。

2 个答案:

答案 0 :(得分:1)

我不知道你是否找到了解决方法。我刚刚看到完全相同的错误,这是由于没有设置TransformerFactory。

我使用了Saxon库中的TransformerFactory - 可以获得的jar here

然后我设置了一个引用Saxon TransformerFactory的系统属性:

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");

当我重新运行我的代码时,错误就消失了。

以上只是设置TransformerFactory的一种方法。我在这里找到了许多其他方法:stackoverflow.com/questions/11314604/

答案 1 :(得分:1)

看起来问题在于您的soapText中的名称空间前缀。我能够毫无错误地执行您的示例,而无需通过修改soapText手动设置任何TransformerFactory,如下所示:

String soapText = 
     "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:upd=\"http://webservices.vm.vmc/UpdateCMA/\">" +
        "<soapenv:Header/>" +
        "<soapenv:Body>" +
          "<upd:ProcessJournal/>" +
        "</soapenv:Body>" +
     "</soapenv:Envelope>";

请注意所有Soap元素中添加的 soapenv:前缀,而不是Soap服务命名空间中的 upd 前缀。