[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 メーリングリストの案内