- PR -

Objectへのクラス代入について

投稿者投稿内容
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 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 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-16 11:46
「シリアライズを行っています」というのは、Serializableインタフェースを実装
していることを指していますか?

だとすると、Webサービスのマーシャリング/アンマーシャリングでオブジェクトの
シリアライズ/デシリアライズをして受け渡すという前提になりますが、そのように
実装していますか? WebサービスとRMIあたりがごっちゃになっていませんか?
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-03-16 11:54
引用:

ukさんの書き込み (2006-03-16 11:46) より:
「シリアライズを行っています」というのは、Serializableインタフェースを実装
していることを指していますか?


説明が不正確でした。
その通りです。特に何か行っている訳ではありません。

引用:

だとすると、Webサービスのマーシャリング/アンマーシャリングでオブジェクトの
シリアライズ/デシリアライズをして受け渡すという前提になりますが、そのように
実装していますか? WebサービスとRMIあたりがごっちゃになっていませんか?


特に、シリアライズ/デシリアライズを行う処理というのは実装していないのですが、
何か行わなければならないでしょうか?
手順としては、先のような処理内容をEJBで作成し、その後、Webサービス化し
J2EEサーバーにデプロイしています。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-16 14:06
そもそも「Webサービス化」したとは、どのようなことを指しているのでしょうか。

リモート間の呼び出しでは、なんらかの形でオブジェクトの内容を受け渡しする必要が
あります。Javaに閉じているEJBであれば、Javaの機構であるシリアライズの機能を
利用できますが、Webサービスの場合はそのオブジェクトの内容をXMLに展開して渡し、
受け取った側はそのXMLデータからオブジェクトの内容を復元する必要があります。

まず、そのことは理解しているでしょうか。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-03-16 17:43
引用:

そもそも「Webサービス化」したとは、どのようなことを指しているのでしょうか。


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を実装する以外に、実装面で足りない処理があるのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-03-16 19:15
Webサービスの実装にもよるでしょうから、どの製品を使っているかを書いてはいかがでしょうか?

EJB のメソッドコールをする場合は Java の直列化機能を使いますが、XML にシリアライズ/XMLからシリアライズするのは大抵 Webサービスを実装している製品側で行います。
"Object"ではどのようにシリアライズ/デシリアライズすればよいのか判断できないので、実際に代入するクラスの型を書くのが良いのではないでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-03-16 20:08
引用:

OZさんの書き込み (2006-03-16 17:43) より:
今度はそのEJBをデプロイヤがサーバーにサービスとして登録し、C/S間のやり取りは
WSDLより作成したプロキシ経由でSOAPにより行っています。


デプロイヤとは何のことですか?

引用:

XMLへの変換はミドルウェアが行ってくれると認識しているのですが、上記のメッセージを見る限り
変換ができていないようです。


ミドルウェアとは何を指していますか? アプリケーション・サーバ?
サーバ側がなんらかの変換をするとして、クライアント側ではそれを復元する必要が
ありますが、クライアント側には何を使っているのですか?

引用:

Serializableを実装する以外に、実装面で足りない処理があるのでしょうか?


JavaにおけるシリアライズとXMLデータとのマーシャリング/アンマーシャリングとは
直接関係ありません。とにかく具体的なことがわからないとアドバイスのしようが
ないのですよ。
OZ
常連さん
会議室デビュー日: 2006/02/27
投稿数: 45
投稿日時: 2006-03-16 21:37
ukさん、インギさん、レスが遅くなり申し訳ございませんでした。

引用:

デプロイヤとは何のことですか?


この場合、デプロイ担当者の事を指しています。

引用:

ミドルウェアとは何を指していますか? アプリケーション・サーバ?


JAVAからXMLへ変換を行ってくれるパーサーのようなものだと思っています。

引用:

Webサービスの実装にもよるでしょうから、どの製品を使っているかを書いてはいかがでしょうか?



実行環境は、
クライアント:Windows2000Pro(SP4)、J2SE 1.4.2.07
サーバ:HP-UX11.23、J2EE 1.3
となります。

引用:

"Object"ではどのようにシリアライズ/デシリアライズすればよいのか判断できないので、実際に代入するクラスの型を書くのが良いのではないでしょうか。



ここで書いた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を設定する際にキャストを行ってみても結果は同じでした。

宜しくお願い致します。

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