3

次のSOAPClientforJavaを使用しようとしています(詳細は次のチュートリアルhttp://users.skynet.be/pascalbotte/rcx-ws-doc/saajpost.htmから取得しました)。

ただし、例外をスローしているようです。

これが私のコードです:

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)

このWebサイトを使用すると、サービスは稼働しており、正常に機能しているようです。

単純なcURLリクエストを実行することで、サービスエンドポイントがアクティブであることを確認しました。これにより、驚くほど正しい出力が生成されます。

curl -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction:http://www.parasoft.com/wsdl/calculator/" -d@soap-request.xml 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/‘&gt;
    <soap:Body>
        <n:addResponse xmlns:n='http://www.parasoft.com/wsdl/calculator/‘&gt;
            <n:Result xsi:type='xsd:float'>613.0</n:Result>
        </n:addResponse>
    </soap:Body>
</soap:Envelope>

だから、私の質問は次のとおりです。まず、Javaコードの何が問題になっていますか?そして、どのようにそれを修正することができますか?または、推奨される他のより優れた/より信頼性の高い汎用SOAPClientライブラリはありますか?

4

1 に答える 1

0

ブラウザの URL に ?wsdl を添付して WSDL を確認するか、何らかの方法で WSDL を取得します。WSDl がドキュメント スタイルか PRC スタイルかを指定しているかどうかを確認し、それに基づいて入力 xml を準備します。

可能であれば、非常に便利な SOAP UI ツールを使用してください。

于 2012-07-18T18:55:21.363 に答える