[Seasar-user:19299] Re: セッションのDIについて
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2010年 2月 12日 (金) 17:30:01 JST
小林 (koichik) です.
Date: Fri, 12 Feb 2010 16:08:28 +0900
From: "Hidemasa Aoki" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:19296] Re: セッションのDIについて
> ―――――――――――――――――――――――――――――――
> ログインインタセプターの中で、ログイン情報を取得しています。
> この処理で、HOTのときは、operatorNameにログイン時に設定した値が返却されるの
> に、COOLのときは、nullが返却されます。
>
> public class LoginInterceptor extends AbstractInterceptor {
>
> private static final long serialVersionUID = -803577202478748124L;
>
> private OperatorDto operatorDto;
このインターセプタのインスタンス属性は singleton には
なり得ません.
インスタンス属性が singleton とは,
「ドキュメント」−「DIContainer」−「インスタンス管理」
http://s2container.seasar.org/2.4/ja/DIContainer.html#InstanceMode
----------------------------------------------------------------------
S2Container.getComponent()を何度呼び出しても同じインスタンスが返されます。
----------------------------------------------------------------------
と書いてあるように,S2 コンテナ中で一つだけ
インスタンスが作成されます.
それでは,LoginInterceptor の唯一のインスタンスに
設定される OperatorDto のインスタンスは,誰の
HttpSession に保存されているインスタンスが
適切でしょうか?
10 人がログインしていれば,10 個の OperatorDto の
インスタンスが存在しますが,LoginInterceptor の
インスタンスは一つだけです.
どの OperatorDto を設定すればいいでしょうか?
そのような Dto のインスタンスは存在しません.
# Dto の proxy を設定するという案もありますが,
# Seasar2 では採用していません.
よって,このインターセプタは singleton ではなく,
HttpServletRequest や HttpSession に保存する必要も
ないので,prototype が適切ということになります.
そして singleton 以外のインターセプタを使用する場合は,
「ドキュメント」−「DIContainer」−「SMART deploy」−「カスタマイザ設定例」−「インスタンス属性がsingleton以外のインターセプタを利用する」
http://s2container.seasar.org/2.4/ja/DIContainer.html#useLookupAdapter
----------------------------------------------------------------------
インターセプタを適用するAspectCustomizerのuseLookupAdapterプロパティに
trueを設定をします。
<component name="pageCustomizer"
class="org.seasar.framework.container.customizer.CustomizerChain">
<initMethod name="addCustomizer">
<arg>
<component class="org.seasar.framework.container.customizer.AspectCustomizer">
<property name="useLookupAdapter">true</property>
<property name="interceptorName">"app_aop.authenticateInterceptor"</property>
<property name="pointcut">"do.*"</property>
</component>
</arg>
</initMethod>
</component>
----------------------------------------------------------------------
と書いてあるように,customizer.dicon で
useLookupAdapter プロパティに true を設定する
必要があります.
そうすれば,
> この処理で、HOTのときは、operatorNameにログイン時に設定した値が返却されるの
> に、COOLのときは、nullが返却されます。
ということは起こらないはずです.
HOT でも COOL でも,LoginInterceptor には
その時の HttpSession に保持されている
operatorDto が設定されます.
LoginInterceptor は singleton 以外のインターセプタで
あるにも関わらず,もし useLookupAdapter プロパティを
設定していないのだとしたら (customizer.dicon が
提示されてないので判断できませんが),それは設定の
問題です.
[Seasar-user:19272]
> 間違った設定といわれても、Doltengが吐き出した設定をまねしているだけです。
Dolteng が生成するひな形では,TraceInterceptor や
TxAttributeCustomizer など,singleton の
インターセプタしか使っていません.
そのため,useLookupAdapter プロパティも設定していません.
Dolteng が生成した設定をまねさえすれば,それだけで
すべてがうまくいくというわけではありません.
--
<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 メーリングリストの案内