[Seasar-user:17537] Re: [SAStruts] S2ContainerListenerを登録すると起動時に

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 5月 27日 (水) 17:00:01 JST


小林 (koichik) です.

Date:    Wed, 27 May 2009 15:41:10 +0900
From:    徳永 広樹 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:17536] [SAStruts] S2ContainerListenerを登録すると起動時に

> SAStrutsにS2ContainerListenerを登録し、production(COOL deployモード)で
> 起動を行った場合以下のエラーが発生します。
> (ct、utの環境では発生しません)

・COOL deploy では S2 コンテナの初期化時に
  コンポーネントの初期化を行います.
・SAStruts のコンポーネント (ActionCustomizer) は
  Struts の初期化が終わった後に初期化される必要があります.
・S2ContainerListener を使うと S2 コンテナは
  Servlet より先に初期化されます.
・Struts の初期化は ActionServlet で行われます.

つまり,S2ContainerListener を使うと Struts の
初期化が行われる前に SAStruts の初期化が始まって
しまい,例外が発生します.

> 実際にやりたいこととしては、
> 「ServletContextListenerにてComponentを取得したい」
> と考えております。
> 
> ここで質問なのですが
> 1.ServletContextListenerにてComponentを取得するという考え方自体が
> あまりよくないのでしょうか?

本来はよくないということもないはずですが,例えば
S2Axis と Teeda を組み合わせる場合なども Axis の 
Servlet で初期化された後でないと S2Axis の初期化が
できないなど同じ制限があるので,多くの場合は
Listener より Servlet で初期化する方が無難です.
なので,Listener で S2 を使うのも避けた方が無難です.

> 2.SAStrutsではS2ContainerListenerを使用するべきではないのでしょうか?

そうなります.
Struts が ActionServlet の初期化相当をやってくれる
Listener を提供しているなら別ですが.

> 3.使用すべきでない場合代替手段などありますでしょうか?

Listener でやろうとしている処理を Servlet あるいは
S2 で管理されるコンポーネントでやるのがよいかと.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内