- - PR -
Webserviceで継承オブジェクトを渡す
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-12-09 11:38
こんにちわ。
下記問題で悩んでいます。 ---- WebLogic8.1(試用版) ---- Webserviceにて以下のようなインターフェースは定義できないのでしょうか。
この際、CarとSuperCarはもちろん継承関係にあるのですが、クライアント側 に返る型としてはCarです。 WSDLとしてはCarが定義され、自動生成されるであろうスタブにもCarのみの スタブクラスができます。 その際SuperCarクラスにキャストできるはずもないのでエラーになるのですが このようなケースをWebserviceで実装することはできないのでしょうか? | ||||||||
|
投稿日時: 2004-12-09 11:54
SuperCarとCarと、どっちが親でどっちが子なんですか? Carが親で、SuperCarが子なら、ちゃんとお望み通りに動くと思うのですが。 | ||||||||
|
投稿日時: 2004-12-09 12:35
CarとSuperCarは「extends Car」なのでCarが親ですね。
しかしながら、wsdlの定義ではWebserviceメソッドの public Car test()に関するCarの定義しか出てきません。 よって、クライアント側でSuperCarが認識できないため コンパイル時にクラスが見つからないエラーとなります。 EJBなどでしたら、リモートファイルをクライアントに 渡すことでクラスパスを通したりしますが、WebService ではWSDLが全てだと思いますので、それもできません。 そもそもWSDLの構築の仕方が悪いのでしょうか。 一般的にWebServiceでこのようなケースって構築できるんでしょうか。 | ||||||||
|
投稿日時: 2004-12-09 14:05
状況がわかりづらいかもしれませんので具体的に書きたいと思います。
少々長くなりますが。。 【サーバ】 1.WebServiceとなるクラスを作成 ・SampleService.java ・Car.java ・SuperCar.java(extends Car) コード内容は前投稿を参照ください。 2.WebLogicのantタスクによりビルド(servicegen) 3.WebLogicにデプロイし完了 以下が生成されるWSDLの一部抜粋です
【クライアント】 1.WebLogicのantタスクによりスタブ生成(clientgen) 2.Clientとなるクラスを作成 コードイメージは以下
3.コンパイルエラー SuperCar car = (SuperCar) port.test(); ここで「シンボルが解釈できない」エラーとなります。 ちなみにクライアント側で自動生成されるスタブ群は以下 Car.class CarCodec.class SampleService.class SampleServiceImpl.class SampleServicePort.class SampleServicePort_Stub.class SampleService.wsdl SampleService.xml /holders/CarHolder.class エラーになるのは当たり前です。 クライアント側にSuperCarクラスがないからです。 問題は、このような継承関係をWebserviceでやり取りする場合、 そもそもできないのか。もしくは私の理解不足なだけで可能な のか、です。 可能であれば、wsdlにSuperCarの記述が出てくるようにできる のか、もしくは他の方法でスタブに混ぜることができるのか。 このような感じです。 | ||||||||
|
投稿日時: 2004-12-09 17:48
そもそも継承させて何をさせたいんでしょうか。Webサービスでやりとりできるのはデータだけ ですし、継承関係を保持する意味がないと思うのですが。どうしてもやりたいのであれば、 カスタムのマッピングクラス(WebLogicでどうやるのかはわかりませんが)を作るしかないで しょう。 | ||||||||
|
投稿日時: 2004-12-09 18:03
ありがとうございます。
やはりできなさそうですか。 Webserviceのインターフェースはなるべく変えたくない というのが目的としてあったので質問しました。 SuperCarの部分は変動性の高い代物であり SuperCar以外のクラスが新たなに発生した場合のことを 考え、このようなことができればと思いました。 ちょっと考えてみます。 | ||||||||
|
投稿日時: 2004-12-09 19:20
そもそもWebサービスの利用側、提供側がOOPLで実装されているとは限らないので、OOPLを
前提とした仕様がWSDLに入っているとは思えません。ここでいうところのCarクラスは通常 DTOのようなものにするのが普通だと思うのですが、設計から見直したほうがいいのでは ないですか? | ||||||||
|
投稿日時: 2004-12-09 19:39
確かに考えがJavaの外へ飛び出すのでそこからして違うんだろうと思います。
今やっていることは、ある既存システムがあってそれをWebサービスを アダプタとして外部に公開みたいなことを検証しています。 もともと、色々工夫して改造・変更・追加があった時でも改造量を少なく するという目的でトリッキーなことをやってましたが、その旨味をWebサービス 化することでなくしてしまうのを嫌った結果です。 Webサービスでやり取りするデータは非常に簡易にするのが一番良さそうですね。 |