- PR -

クロスコンテキスト使用時のキャスト

投稿者投稿内容
ぴょん
会議室デビュー日: 2005/10/17
投稿数: 4
投稿日時: 2005-11-29 18:11
いつもお世話になっています。

ServletContext経由で、他のwebアプリにオブジェクトを転送したいと考えています。
setAttributeを使用して転送すると、取得時にClassCastExceptionが発生してしまいます。

とりあえず現在は、シリアライズを使用してbyte[]を使用して引き渡すことで回避していますが、
ほかに何かいい方法はないのでしょうか?

コード:
【webアプリ A】

MyObj obj = getObj();
ServletContext toSc = getServletContext().getContext("/b");

toSc.setAttribute("KEY", obj);

【webアプリ B】

ServletContext sc = getServletContext();

MyObj obj = (MyObj)sc.getAttribute("KEY"); // <-- ここでClassCastException


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-29 19:40
ServletContextはWebアプリケーション毎に作成されるので、それを経由してオブジェクトを渡すことはできないと思います。どうやっているんでしょう???

問題としては異なるクラスローダで読み込まれていることに起因するので、システムクラスパスにクラスを通すことで一応回避できそうです。ただし再デプロイで更新できなくなりますが。
これ↓も参考になるかもしれません。
・BEA トラブルシューティング ガイド サポート診断パターン > ClassCastException の調査
http://www.beasys.co.jp/cs/support_news/product_troubleshooting/Class_Cast_Exceptions_Pattern.html
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-11-29 23:14
「ドッペルゲンガー」で検索すると幸せになれるかもしれません。


matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2005-11-30 02:48
検索してみたんですが、なんだかよくわかりません。
なんか面白い情報があるんですか? > 「ドッペルゲンガー」
c9katayama
常連さん
会議室デビュー日: 2003/02/04
投稿数: 38
投稿日時: 2005-11-30 09:29
わたしも昔、これではまったことがあったので、検索してみました。
これですかね?

http://www-06.ibm.com/jp/software/websphere/developer/j2ee/strategy/3.html

#前にはまったときは、リフレクションで回避してしまいました・・・
ぴょん
会議室デビュー日: 2005/10/17
投稿数: 4
投稿日時: 2005-11-30 10:39
いろいろ情報、ありがとうございました。

まあ、ClassLoaderが違うので、単純なキャストは無理というのはわかっていたんですが、
せっかく、他のwebアプリのServletContextを取得できるAPIがあるんだから、
その辺の移送を簡単にできるAPIがなんか無いものかな?と思って質問しました。

どうもなさそうなので、現状のシリアライズベースのコードのままいこうと思います。

ありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-30 10:46
>せっかく、他のwebアプリのServletContextを取得できるAPIがあるんだから、
そんなAPIありましたっけ?どうやるんでしょうか?
ぴょん
会議室デビュー日: 2005/10/17
投稿数: 4
投稿日時: 2005-11-30 11:10
>インギさん

コード:
ServletContext toSc = getServletContext().getContext("/b");



で、コンテキストルートが「/b」のServletContextを取得できます。
詳細は、
ServletContext#getContext(String)
のAPIをご参照ください。

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