- PR -

JAVA から NetDictionary は利用できない?

1
投稿者投稿内容
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-02-23 16:28
つい先日、Webサービスの研修(言語はJava)を受けてきたので、ちょうどいい機会だと思い、IBM の Web Services Toolkit 3.0 を使って JAVA から NetDictionary を利用できるのかどうかためしています。

以下のURLからWSDLファイルを入手して、スタブファイル(javaソース)を作成しました。
http://www.iwebmethod.net/icd1.0/icd.asmx?WSDL
コマンドはエラーもなく、一見正常に実行できているように見えましたが、いざ生成されたスタブファイルをコンパイルしようとすると、コンパイルエラーとなってしまっています。

コンパイルエラーの内容を注意深く見ていると、どうもメソッドの引数や戻り値などで使用されているクラスのスタブファイルが生成されていないようでした。

さらによくみると、
ArrayOfWORD、WORD、ITEM、ArrayOfWEBPAGE、WEBPAGE のスタブファイルは作成されているようです。
これらは、WSDLのtype の宣言で
<s:complexType name="XXXX">
と記述されているもので、逆に type の宣言で
<s:element name="XXXX">
という記述がされているクラスのスタブファイルが生成されていないようです。


さて、ここまではやってみたものの、
・WSDLの書き方が悪い(WSDLがメーカで統一されていない)
・IBM Web Services Toolkit 3.0 のバグ
・単純に私のやり方が悪い
のいずれなのか判断つきません。

JAVA から NetDictionary を試された方がいらっしゃれば、ぜひ結果を教えてください。
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-02-23 22:00
以下、WSDL4Jはちゃんと使ったことがないのではずしてるかもしれません。

WSDL4Jはdocument/literalに対応しているのでしょうか?

ASP.NETのWebサービス機能(NetDictionaryが使ってるもの)のデフォルトは、このdocument/literalで、SOAPのBody内部をXML文書として扱うので、普通<element>であることが求められます。

ASP.NETでも、SoapRpcServiceやSoapRpcMethodの指定をしてあげることで、rpc/encodedなサービス(とWSDL)の生成が可能です。この場合は、通常<complexType>だけが宣言されます。

世の中の多数のSOAP処理系が、rpc/encodedしかサポートしません。Apache SOAPを始め、最近ようやくdocument/literalの実装が始まりました。その意味では、WSDL4Jがrpc/encodedしか処理できなくてもなんら不思議はない、とは思います。

WSDLに関しては、ようやくW3Cでも議論が始まったところですし、相互運用性にまだまだ難があるのも事実だと思います。ですが、SOAP実装者たちの集まりでも、WSDLの相互運用性の検証が始まりましたし、未来はそう暗くはないとも思います。

[ メッセージ編集済み 編集者: NothingBut.NETFW 編集日時 2002-02-25 15:39 ]
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-02-25 10:39
大変参考になるアドバイスありがとうございます。

私自身不勉強のため、「document/literal」「rpc/encoded」という言葉さえ知りませんでした。

http://www.w3.org/TR/2001/NOTE-wsdl-20010315#_soap:operation
を参考に、WSDLファイルを見直してみました。
soap:binding や soap:operation のstyle 属性の指定は、確かに研修で使用した WSDL(Web Services Toolkitを使って出力したもの)が rpc となっているのに対し、NetDictionary の WSDLは document となっていました。(当然、messageタグの書き方も違っていました。)
soap:body の use属性も encoded と literal で違っていました。


おっしゃられる通り WSDL4J は、まだ document/literalに対応していないのかもしれません。(私の使い方が悪いだけかもしれませんが。)

確かにWebサービス自体まだまだこれからといった感が強そうですね。これからの発展を期待したいところです。
ikkoh
会議室デビュー日: 2002/02/26
投稿数: 1
投稿日時: 2002-02-26 04:21
WSTK3.0からSOAPの実装がApache Axisになっています。WSTKに付属のAxis(alpha3)では、SOAP接続タイプがdocument/literalのWSDLから上手く(簡単に使える)Javaのプロキシを生成してくれないようです。現在公開されているAxisのNightly buildsであれば、document/literalでも使えるプロキシを生成してくれます。これもWSDLによりますが、NetDictionaryに接続できたことを確認しました。

-- プロキシの生成
> java org.apache.axis.wsdl.WSDL2Java http://www.iwebmethod.net/icd1.0/icd.asmx?WSDL

-- クライアントサンプル
コード:
import net.iwebmethod.www.*;

public class Client {
  public static void main(String[] args) {
    try {
      ICDSoap binding = new ICDLocator().getICDSoap();
      ArrayOfWORD value = binding.searchWord("soap", true);
      ITEM item = binding.getItemById(value.getWORD(0).getId());
      System.out.println(item.getMeaning());
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}



Nightly buildsですので、参考までに...
xml.apache.org/axis/index.html
ふうた
大ベテラン
会議室デビュー日: 2001/08/23
投稿数: 198
お住まい・勤務地: 岡山
投稿日時: 2002-02-26 10:17
ご返答ありがとうございます。
とりあえず、私も試しにやってみました。確かにうまくいきました。
(スタブを生成するクラスが、WSTK3.0では、Wsdl2java だったのに Nightly builds では WSDL2Java になっていて微妙に違っているのにはやられましたが… )

Nightly builds でうまくいくということは、WSTKの次の次のバージョンでは問題なさそうだと期待できますね。

これで私のやり方が多分間違っていなかったのだと確認できてほっとしました。

ありがとうございました。

[ メッセージ編集済み 編集者: ふうた 編集日時 2002-02-26 10:19 ]
1

スキルアップ/キャリアアップ(JOB@IT)