2012-07-18 153 views
3

我正在尝试使用以下SOAPClient for Java(详细信息,我从以下教程http://users.skynet.be/pascalbotte/rcx-ws-doc/saajpost.htm获得)。使用Java通用SOAPClient(SAAJ)时抛出异常?

但是,它似乎是抛出一个例外。

这里是我的代码:

javax.xml.soap.SOAPMessage msg; 
MessageFactory mf = MessageFactory.newInstance(); 
msg = mf.createMessage(); 
SOAPPart part = msg.getSOAPPart(); 
StreamSource source = new StreamSource(new File("samples/input1.xml”)); 
part.setContent(source); 
msg.saveChanges(); 

String endpoint = "http://ws1.parasoft.com/glue/calculator"; 

SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance(); 
SOAPConnection conn = scf.createConnection(); 
javax.xml.soap.SOAPMessage response = conn.call(msg, endpoint); 
TransformerFactory tff = TransformerFactory.newInstance(); 
Transformer tf = tff.newTransformer(); 
Source sc = response.getSOAPPart().getContent(); 
ByteArrayOutputStream ostream = new ByteArrayOutputStream(); 
StreamResult result = new StreamResult(ostream); 
tf.transform(sc, result); 
conn.close(); 

System.out.println(new String(ostream.toByteArray(), "UTF-8”)); 

在这个例子中,我们假设samples/input1.xml存在以下:

<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s11:Body> 
     <ns1:add xmlns:ns1="http://www.parasoft.com/wsdl/calculator/"> 
     <ns1:x>248</ns1:x> 
     <ns1:y>365</ns1:y> 
     </ns1:add> 
    </s11:Body> 
</s11:Envelope> 

的样品,我试图用可以在这里找到Web服务: http://www.service-repository.com/client/operations

当运行上述Java代码(使用SOAPClient库)时,引发以下异常:

Jul 19, 2012 3:50:11 AM com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post 
SEVERE: SAAJ0008: Bad Response; cannot find /calculator 
Exception in thread "main" com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404cannot find /calculator 
    at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:148) 
    at corebus.test.deprecated.TestMain.main(TestMain.java:1870) 
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404cannot find /calculator 
    at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:258) 
    at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:144) 
    ... 1 more 

CAUSE: 

com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404cannot find /calculator 
    at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:258) 
    at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:144) 

使用这个网站,似乎服务已经启动并运行,并且运行良好。

我甚至通过一个简单的cURL请求验证了服务端点是活动的,这令人惊讶地产生了正确的输出。

curl -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction:http://www.parasoft.com/wsdl/calculator/" [email protected] http://ws1.parasoft.com/glue/calculator 

产生的输出是:

<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/‘> 
    <soap:Body> 
     <n:addResponse xmlns:n='http://www.parasoft.com/wsdl/calculator/‘> 
      <n:Result xsi:type='xsd:float'>613.0</n:Result> 
     </n:addResponse> 
    </soap:Body> 
</soap:Envelope> 

所以,我的问题是:首先,什么是错的Java的代码?它怎么能被修复?或者,还有其他更好/更可靠的通用SOAPClient库会被推荐吗?

回答

0

通过在浏览器中将?wsdl附加到您的url中或以某种方式获取他的WSDL来查看WSDL。检查WSDl是否指定它是文档样式还是PRC样式,并基于该样式准备输入xml。

如果可能的话,使用SOAP UI工具可以非常方便。

+0

我一直在寻找soapUI ..但是,如果我没有弄错,那么需要与Java集成的依赖关系看起来非常庞大。你(或任何人)有使用soapUI作为Java Lib的经验吗? – Larry 2012-07-18 18:59:34