- PR -

Webserviceで継承オブジェクトを渡す

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-09 11:38
こんにちわ。

下記問題で悩んでいます。

----
WebLogic8.1(試用版)
----


Webserviceにて以下のようなインターフェースは定義できないのでしょうか。

コード:
public Car test() {
    SuperCar supercar = new SuperCar();
    return supercar();
}



この際、CarとSuperCarはもちろん継承関係にあるのですが、クライアント側
に返る型としてはCarです。

WSDLとしてはCarが定義され、自動生成されるであろうスタブにもCarのみの
スタブクラスができます。

その際SuperCarクラスにキャストできるはずもないのでエラーになるのですが
このようなケースをWebserviceで実装することはできないのでしょうか?
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-12-09 11:54
引用:

この際、CarとSuperCarはもちろん継承関係にあるのですが、クライアント側
に返る型としてはCarです。



SuperCarとCarと、どっちが親でどっちが子なんですか?
Carが親で、SuperCarが子なら、ちゃんとお望み通りに動くと思うのですが。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-09 12:35
CarとSuperCarは「extends Car」なのでCarが親ですね。

しかしながら、wsdlの定義ではWebserviceメソッドの
public Car test()に関するCarの定義しか出てきません。

よって、クライアント側でSuperCarが認識できないため
コンパイル時にクラスが見つからないエラーとなります。




EJBなどでしたら、リモートファイルをクライアントに
渡すことでクラスパスを通したりしますが、WebService
ではWSDLが全てだと思いますので、それもできません。



そもそもWSDLの構築の仕方が悪いのでしょうか。


一般的にWebServiceでこのようなケースって構築できるんでしょうか。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-09 14:05
状況がわかりづらいかもしれませんので具体的に書きたいと思います。
少々長くなりますが。。

【サーバ】
1.WebServiceとなるクラスを作成
  ・SampleService.java
  ・Car.java
  ・SuperCar.java(extends Car)
  コード内容は前投稿を参照ください。

2.WebLogicのantタスクによりビルド(servicegen)
3.WebLogicにデプロイし完了

以下が生成されるWSDLの一部抜粋です
コード:
<types>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   xmlns:stns="java:sample" 
   elementFormDefault="qualified" 
   attributeFormDefault="qualified" 
   targetNamespace="java:sample">
    <xsd:complexType name="Car">
      <xsd:sequence>
        <xsd:element type="xsd:string" 
         name="engine" 
         minOccurs="1" 
         nillable="true" 
         maxOccurs="1" /> 
      </xsd:sequence>
    </xsd:complexType>
  </xsd:schema>
</types>

<message name="service" /> 
<message name="serviceResponse">
  <part xmlns:partns="java:sample" type="partns:Car" name="result" /> 
</message>






【クライアント】
1.WebLogicのantタスクによりスタブ生成(clientgen)
2.Clientとなるクラスを作成
  コードイメージは以下
  
コード:
  public static void main( String[] args ) {
    String wsdlUrl = "http://***/webservice/SampleService?WSDL"; 
   SampleService service = new SampleService_Impl( wsdlUrl );
   SampleServicePort port = service.getSampleServicePort();

   SuperCar car = (SuperCar) port.test();
  }
  


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の記述が出てくるようにできる
のか、もしくは他の方法でスタブに混ぜることができるのか。

このような感じです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-12-09 17:48
引用:

問題は、このような継承関係をWebserviceでやり取りする場合、
そもそもできないのか。もしくは私の理解不足なだけで可能な
のか、です。


そもそも継承させて何をさせたいんでしょうか。Webサービスでやりとりできるのはデータだけ
ですし、継承関係を保持する意味がないと思うのですが。どうしてもやりたいのであれば、
カスタムのマッピングクラス(WebLogicでどうやるのかはわかりませんが)を作るしかないで
しょう。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-09 18:03
ありがとうございます。

やはりできなさそうですか。

Webserviceのインターフェースはなるべく変えたくない
というのが目的としてあったので質問しました。

SuperCarの部分は変動性の高い代物であり
SuperCar以外のクラスが新たなに発生した場合のことを
考え、このようなことができればと思いました。

ちょっと考えてみます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-12-09 19:20
そもそもWebサービスの利用側、提供側がOOPLで実装されているとは限らないので、OOPLを
前提とした仕様がWSDLに入っているとは思えません。ここでいうところのCarクラスは通常
DTOのようなものにするのが普通だと思うのですが、設計から見直したほうがいいのでは
ないですか?
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-12-09 19:39
確かに考えがJavaの外へ飛び出すのでそこからして違うんだろうと思います。

今やっていることは、ある既存システムがあってそれをWebサービスを
アダプタとして外部に公開みたいなことを検証しています。

もともと、色々工夫して改造・変更・追加があった時でも改造量を少なく
するという目的でトリッキーなことをやってましたが、その旨味をWebサービス
化することでなくしてしまうのを嫌った結果です。

Webサービスでやり取りするデータは非常に簡易にするのが一番良さそうですね。

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