- - PR -
Objectへのクラス代入について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-16 10:35
J2EEサーバ→Webサービス→クライアント
でWebサービスを作成しています。 サーバからクライアントへBean(クラス)としてデータを渡そうとしているのですが、 Bean毎にインターフェースを作成するのではなく、実行結果受け取り用のインターフェースを 一つ準備し、その中にObject変数を作成しBeanを入れてクライアントに渡そうとしています。 Class Myclass implements Serializable{ private int i = 0; private Object obj; public Myclass(){ } //アクセッサ public void setI(int i){ this.i = i; } public void setObj(Object obj){ this.obj = obj; } public int getI(){ return i; } public Object getObj(){ return obj; } } Class Kekka1 implements Serializable{ private String s1 = new String("test1"); private String s2 = new String("test2"); //getter public String getS1(){ return s1; } public String getS2(){ return s2; } } T.Webサービス: public Myclass method1(){ Kekka1 result = new Kekka1(); Myclass res = new Myclass(); res.setObj(result); ---@ return res; } U.クライアント: Myclass myclass = method1(); Kekka1 kekka = myclass.getObj(); ---A ところが、単純なアプリケーション中(T・Uを同じクラス内で実行)では、 kekkaの中身はKekka1クラスとなっているのですが、Webサービス化して 実行するとAでnullが返ってきます。 受け取り用のクラスも、Objectに代入するクラスもシリアライズを行っています。 原因は何が考えられるでしょうか? 宜しくお願いします。 [ メッセージ編集済み 編集者: OZ 編集日時 2006-03-16 10:37 ] | ||||||||||||||||
|
投稿日時: 2006-03-16 11:46
「シリアライズを行っています」というのは、Serializableインタフェースを実装
していることを指していますか? だとすると、Webサービスのマーシャリング/アンマーシャリングでオブジェクトの シリアライズ/デシリアライズをして受け渡すという前提になりますが、そのように 実装していますか? WebサービスとRMIあたりがごっちゃになっていませんか? | ||||||||||||||||
|
投稿日時: 2006-03-16 11:54
説明が不正確でした。 その通りです。特に何か行っている訳ではありません。
特に、シリアライズ/デシリアライズを行う処理というのは実装していないのですが、 何か行わなければならないでしょうか? 手順としては、先のような処理内容をEJBで作成し、その後、Webサービス化し J2EEサーバーにデプロイしています。 | ||||||||||||||||
|
投稿日時: 2006-03-16 14:06
そもそも「Webサービス化」したとは、どのようなことを指しているのでしょうか。
リモート間の呼び出しでは、なんらかの形でオブジェクトの内容を受け渡しする必要が あります。Javaに閉じているEJBであれば、Javaの機構であるシリアライズの機能を 利用できますが、Webサービスの場合はそのオブジェクトの内容をXMLに展開して渡し、 受け取った側はそのXMLデータからオブジェクトの内容を復元する必要があります。 まず、そのことは理解しているでしょうか。 | ||||||||||||||||
|
投稿日時: 2006-03-16 17:43
EJBを作成し、サーバーへデプロイ後にクライアントプログラムからlookupし、 EJBを実行すると、Object変数の内容はプログラムで設定したBeanになっています。 今度はそのEJBをデプロイヤがサーバーにサービスとして登録し、C/S間のやり取りは WSDLより作成したプロキシ経由でSOAPにより行っています。 それを指してWebサービス化と書いていました。 この後者のSOAPによる実行を行うと、クライアントで受け取ったObject変数の内容が nullになっています。 サーバーからのレスポンス情報は以下のようになっています。 ==================================== HTTP/1.1 200 OK Connection: close Server: XXX Content-Type: text/xml; charset=UTF-8 Date: Thu, 16 Mar 2006 08:28:35 GMT <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ><SOAP-ENV:Body><rpl:TestMethod1 xmlns:rpl='urn:XXX_WS01Vi'><rpl:Response xmlns:pns='urn:com.test.bean'><pns:errMsg>test TestMethod1</pns:errMsg><ns1:objects xmlns:ns1='urn:com.test.bean' xmlns:pns='urn:java.lang'><pns:Object xsi:nil='true'></pns:Object></ns1:objects><pns:returnCD>999</pns:returnCD></rpl:Response></rpl:TestMethod1></SOAP-ENV:Body></SOAP-ENV:Envelope> ==================================== XMLへの変換はミドルウェアが行ってくれると認識しているのですが、上記のメッセージを見る限り 変換ができていないようです。 Serializableを実装する以外に、実装面で足りない処理があるのでしょうか? | ||||||||||||||||
|
投稿日時: 2006-03-16 19:15
Webサービスの実装にもよるでしょうから、どの製品を使っているかを書いてはいかがでしょうか?
EJB のメソッドコールをする場合は Java の直列化機能を使いますが、XML にシリアライズ/XMLからシリアライズするのは大抵 Webサービスを実装している製品側で行います。 "Object"ではどのようにシリアライズ/デシリアライズすればよいのか判断できないので、実際に代入するクラスの型を書くのが良いのではないでしょうか。 | ||||||||||||||||
|
投稿日時: 2006-03-16 20:08
デプロイヤとは何のことですか?
ミドルウェアとは何を指していますか? アプリケーション・サーバ? サーバ側がなんらかの変換をするとして、クライアント側ではそれを復元する必要が ありますが、クライアント側には何を使っているのですか?
JavaにおけるシリアライズとXMLデータとのマーシャリング/アンマーシャリングとは 直接関係ありません。とにかく具体的なことがわからないとアドバイスのしようが ないのですよ。 | ||||||||||||||||
|
投稿日時: 2006-03-16 21:37
ukさん、インギさん、レスが遅くなり申し訳ございませんでした。
この場合、デプロイ担当者の事を指しています。
JAVAからXMLへ変換を行ってくれるパーサーのようなものだと思っています。
実行環境は、 クライアント:Windows2000Pro(SP4)、J2SE 1.4.2.07 サーバ:HP-UX11.23、J2EE 1.3 となります。
ここで書いたObjectとは、 java.lang.Object の事になります。 代入しようとしているクラスは、Serializableを実装した単純なフィールドを持つクラスです。 Class Kekka1 implements Serializable{ private String s1 = new String("test1"); private String s2 = new String("test2"); } ※アクセッサ省略 ただ今回の場合、サーバからのレスポンスメッセージで既にObjectの内容が 無いため、クライアントは関係無いと切り分けています。 やろうとしている事は、 Kekka1 → Object → Kekka1 としたいのですが、Webサービスで実行するとクライアントで受け取ったObjectの内容は nullとなっています。 Kekka1を設定する際にキャストを行ってみても結果は同じでした。 宜しくお願い致します。 |