- PR -

BufferedImageをシリアライズして、JSPから使用したい

1
投稿者投稿内容
fline
会議室デビュー日: 2006/01/25
投稿数: 17
お住まい・勤務地: 東京23区
投稿日時: 2006-05-25 22:38

 掲題について教えて頂きたく、投稿します。

【環境】
 Win2k
 Tomcat5.0.x
 jdk1.4.1


【作業内容】
 BufferedImageをシリアライズするべく、Serializableインターフェイスを実装したサブクラスを作成。
 また、BufferedImageのprotectedフィールドをシリアライズの際にバイナリで出力すべく、サブクラスにはBufferedImageと同じパッケージ(java.awt.image)を指定。
 しかし、このサブクラスをjspでインスタンス作成しますとjava.lang.NoClassDefFoundErrorとなり上手くいきません。

 自分で作成したパッケージや、javax.namingなどのパッケージに置いたクラスは問題なくjspファイルからインスタンス作成するのは問題なく行えるのですが……

 なお、クラスファイルの位置はアプリケーションフォルダ配下のWEB-INFにclasses\java\awt\image\クラス名という構成で配置されています。

 何かお気づきの点があれば、ご指摘お願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-05-26 01:33
引用:

flineさんの書き込み (2006-05-25 22:38) より:
 また、BufferedImageのprotectedフィールドをシリアライズの際にバイナリで出力すべく、サブクラスにはBufferedImageと同じパッケージ(java.awt.image)を指定。
 しかし、このサブクラスをjspでインスタンス作成しますとjava.lang.NoClassDefFoundErrorとなり上手くいきません。


protectedフィールドをアクセスしたいだけであれば
java.awt.imageパッケージな必要はないのでは?

NoClassDefFoundErrorとなるのは、WebappClassLoaderがjava.で始まる
パッケージの場合は無条件にシステム側のクラスローダを使うからです。
これにより/WEB-INF/classes/java/以下のクラスは完全に無視されます。

手元にあったTomcatのソース(5.5.9)では、
org.apache.catalina.loader.WebappClassLoader#findClassInternal(String)
がjava.で始まるクラスの場合に常にClassNotFoundExceptionを送出する実装に
なっていました(探索を打ち切ってシステム側にdelegateする事になります)。

API仕様にも、java.で始まるパッケージのクラスをdefineClass()で
定義しようとするとSecurityExceptionが飛ぶと書いています。
fline
会議室デビュー日: 2006/01/25
投稿数: 17
お住まい・勤務地: 東京23区
投稿日時: 2006-05-29 23:57

 ご返答ありがとうございます。

>API仕様にも、java.で始まるパッケージのクラスをdefineClass()で
定義しようとするとSecurityExceptionが飛ぶと書いています。

 そうですね。Tomcatを通さずに、VMだけで起動するとそのエラーが出ました。お手数かけさせてしまい申し訳ありません。

>protectedフィールドをアクセスしたいだけであれば
java.awt.imageパッケージな必要はないのでは?

 無名パッケージでもいけるかもしれないですね。
 ただ、Tomcatが不慣れなので、どうも無名パッケージだと上手くクラスが認識されないです。
 少し明日試してみます。
 ご指摘ありがとうございました。
1

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