SeasarでServletContextを使ったらはまった。
今日は取り急ぎ、技術的な話。専門外な方はどうぞスルーをば。
今のプロジェクトでSeasar使ってるんですが、ServletContext使おうとしたら、
同じクラス同士なのにキャストできねぇぜ!って怒られまくって、
しかもネットに全然情報見当たらなかったので、備忘録的なエントリー。
調べるたところ、クラスをServletContextに直接突っ込むと、キャストエラーが起こるらしい。
原因は、ClassLoaderがリクエストごと破棄されてて異なるから。
※このサイトはHttpSessionの話だけれど、ServletContextも基本的に同じ。
対策:Map<String, Object> applicationScopeを使う
※参照サイトだと、対策1
※対策2は、InstanceType.APPLICATIONやら、InstanceType.SINGLTONに変えてみたが、キャストエラーが解消されず。
具体的手順はこんな感じ。
1.使いたいクラスにapplicationScopeを宣言
@Resource
protected Map<String, Object> applicationScope;
2.ServletContextにつっこみたいクラスをシリアライズ実装して作成
public class (つっこみたいクラス名) implements Serializable {
private static final long serialVersionUID = 1L;
}
3.使いたいクラスにつっこみたいクラスを宣言
@Resource
protected (つっこみたいクラス名)(クラス名の頭だけ小文字)
■ServletContextへの設定
applicationScope.put((キー名), (2.のクラスにいろいろ値セットしたもの));
■ServletContextからの取得
((つっこみたいクラス名))applicationScope.get((キー名));
こんな感じ。
SeasarもServletContextも使うの初めてでものすごくあわあわした(;´∀`)
同じように困っている人が少しでも早くお悩み解消出来ればこれ幸い。
間違い、補足あれば、ぜひともコメントください。
(2013/01/15 補足)
2.つっこみたいクラス作成に追記。
Serializable実装しないとダメでした。再びキャストエラーに悩まされたので追記。。。
※昨日試したときは、シリアライズしてたのにね。。(´・ω・`)