[Seasar-user:4445] インスタンス属性"session"のコンポーネントを利用するコンポーネントを自動登録する方法

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2006年 8月 30日 (水) 17:14:21 JST


川上と申します。

インスタンス属性="session" のコンポーネントを利用するコンポーネントを
自動登録しようとすると、コンポーネントの生成に失敗してしまいます。


具体的には、以下の事を行おうとしています。

s2struts、s2dao を使用したWebアプリケーションで、DBの全テーブルに
共通して書き込む情報(ユーザ名や作成・更新日時など)を、独自実装した
インターセプターで処理してDBへ書き込む。
これにより各プログラム(Action, Service, Dao)が共通情報を全く意識する
ことなくDBへ書き込めるようにする。


共通情報にはユーザがログインした時点で取得できる情報もある為、
共通情報コンポーネントは、インスタンス属性="session"で登録し、
上記インターセプターから利用しようと考えています。


ところが、実際に上記インターセプターを実装し、インターセプターを適用する
各プログラム(Action, Service, Dao)のコンポーネントを自動登録すると
org.seasar.framework.container.ComponentNotFoundRuntimeException
が発生してしまいます。

個々のAction, Service, Dao を手動でコンポーネント登録すると、上記例外は
発生せずに問題なく稼動します。
また、共通情報コンポーネントのインスタンス属性を "singleton" にした場合も
問題なく稼動します。


インスタンス属性="session" のコンポーネントを利用するコンポーネントを
自動登録する方法はあるのでしょうか?

どなたか御教示いただけたら幸いです。


なお、使用している s2conteinar、s2struts、s2dao のバージョンは下記の通りで
す。

s2-framework-2.3.10.jar
s2-extension-2.3.10.jar
s2-struts-1.2.9.jar
s2-dao-1.0.34.jar


【発生する例外】
2006-08-30 15:48:02,293 [http-8080-Processor24] ERROR 
org.apache.struts.action.RequestProcessor - パス /hogeAction に対するアク
ションのインスタンスがありません
org.seasar.framework.container.ComponentNotFoundRuntimeException: 
[ESSR0046]コンポーネント(interface test.apl.HogeAction)が見つかりません
        at 
org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromGetComponentDef(S2ContainerBehavior.java:94)
        at 
org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromGetComponent(S2ContainerBehavior.java:87)
        at 
org.seasar.framework.container.impl.S2ContainerBehavior.acquireFromGetComponent(S2ContainerBehavior.java:43)
        at 
org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:118)
        at 
org.seasar.struts.action.ActionFactoryImpl.getActionInstance(ActionFactoryImpl.java:97)
        at 
org.seasar.struts.processor.S2RequestProcessor.getActionInstance(S2RequestProcessor.java:171)
        at 
org.seasar.struts.processor.AcceptorImpl.process(AcceptorImpl.java:117)
        at 
org.seasar.struts.processor.S2RequestProcessor.process(S2RequestProcessor.java:61)
        at 
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
        at 
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.seasar.struts.filter.S2StrutsFilter.doFilter(S2StrutsFilter.java:45)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:60)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at 
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at 
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at 
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at 
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Unknown Source)



【自動登録時のdicon = 失敗します】
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
        "http://www.seasar.org/dtd/components23.dtd">
<components  namespace="test">
  <include path="dao.dicon"/>

  <!-- インターセプターの設定 -->
  <component name="traceInterceptor" 
class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
  <component name="lifecycleInterceptor" 
class="org.seasar.framework.aop.interceptors.InterceptorLifecycleAdapter"/>

  <component name="myDaoInterceptor" 
class="test.interceptor.myDaoInterceptor">
    <aspect pointcut="invoke">lifecycleInterceptor</aspect>
  </component>
  <component name="myServiceInterceptor" 
class="test.interceptor.myServiceInterceptor">
    <aspect pointcut="invoke">lifecycleInterceptor</aspect>
  </component>
  <component name="myActionInterceptor" instance="prototype" 
class="test.interceptor.myActionInterceptor">
    <aspect pointcut="invoke">lifecycleInterceptor</aspect>
  </component>

  <!-- インターセプターチェインの設定 -->
  <component name="daoInterceptorChain"
      class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add"><arg>traceInterceptor</arg></initMethod>
    <initMethod name="add"><arg>daoInterceptor</arg></initMethod>
  </component>
  <component name="myServiceInterceptorChain"
      class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add"><arg>myServiceInterceptor</arg></initMethod>
    <initMethod name="add"><arg>traceInterceptor</arg></initMethod>
    <initMethod name="add"><arg>j2ee.requiredTx</arg></initMethod>
  </component>
  <component name="myActionInterceptorChain"
 class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add"><arg>myActionInterceptor</arg></initMethod>
    <initMethod name="add"><arg>traceInterceptor</arg></initMethod>
  </component>


  <!-- DAOの自動登録 -->
  <component
 
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    <property name="autoNaming">
      <component 
class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <property name="instanceDef">
      @[E-MAIL ADDRESS DELETED]
    </property>
    <initMethod name="addClassPattern">
      <arg>"test.apl.common.dao"</arg>
      <arg>".*Dao"</arg>
    </initMethod>
  </component>
  <!-- DAOのインターセプター設定 -->
  <component 
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">myDaoInterceptor</property>
    <property name="pointcut">"insert, update"</property>
    <initMethod name="addClassPattern">
      <arg>"test.apl.common.dao"</arg>
      <arg>".*Dao"</arg>
    </initMethod>
  </component>
  <component 
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">daoInterceptorChain</property>
    <initMethod name="addClassPattern">
      <arg>"test.apl.common.dao"</arg>
      <arg>".*Dao"</arg>
    </initMethod>
  </component>

  <!-- ServiceImplクラスの自動登録 -->
  <component
 
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    <property name="autoNaming">
      <component 
class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <property name="instanceDef">
      @[E-MAIL ADDRESS DELETED]
    </property>
    <initMethod name="addClassPattern">
      <arg>"test.apl"</arg>
      <arg>".*ServiceImpl"</arg>
    </initMethod>
  </component>
  <!-- ServiceImplクラスのインターセプター設定 -->
  <component 
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">myServiceInterceptorChain</property>
    <initMethod name="addClassPattern">
      <arg>"test.apl"</arg>
      <arg>".*ServiceImpl"</arg>
    </initMethod>
  </component>

  <!-- ActionImplクラスの自動登録 -->
  <component
 
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    <property name="instanceDef">
 @[E-MAIL ADDRESS DELETED]
    </property>
    <property name="autoNaming">
      <component 
class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <initMethod name="addClassPattern">
      <arg>"test.apl"</arg>
      <arg>".*ActionImpl"</arg>
    </initMethod>
  </component>
  <!-- ActionImplクラスのインターセプター設定 -->
  <component 
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">myActionInterceptorChain</property>
    <initMethod name="addClassPattern">
      <arg>"test.apl"</arg>
      <arg>".*ActionImpl"</arg>
    </initMethod>
  </component>

  <!-- セッション管理したいコンポーネント -->
  <component name="hogeInfo" class="test.common.HogeInfoImpl" 
instance="session" />

</components>



【手動登録時のdicon = 成功します】
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
        "http://www.seasar.org/dtd/components23.dtd">
<components  namespace="test">
  <include path="dao.dicon"/>

  <!-- インターセプターの設定 -->
  <component name="traceInterceptor" 
class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
  <component name="lifecycleInterceptor" 
class="org.seasar.framework.aop.interceptors.InterceptorLifecycleAdapter"/>

  <component name="myDaoInterceptor" 
class="test.interceptor.myDaoInterceptor">
    <aspect pointcut="invoke">lifecycleInterceptor</aspect>
  </component>
  <component name="myServiceInterceptor" 
class="test.interceptor.myServiceInterceptor">
    <aspect pointcut="invoke">lifecycleInterceptor</aspect>
  </component>
  <component name="myActionInterceptor" instance="prototype" 
class="test.interceptor.myActionInterceptor">
    <aspect pointcut="invoke">lifecycleInterceptor</aspect>
  </component>

  <!-- インターセプターチェインの設定 -->
  <component name="daoInterceptorChain"
      class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add"><arg>traceInterceptor</arg></initMethod>
    <initMethod name="add"><arg>daoInterceptor</arg></initMethod>
  </component>
  <component name="myServiceInterceptorChain"
      class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add"><arg>traceInterceptor</arg></initMethod>
    <initMethod name="add"><arg>j2ee.requiredTx</arg></initMethod>
    <initMethod name="add"><arg>myServiceInterceptor</arg></initMethod>
  </component>
  <component name="myActionInterceptorChain"
 class="org.seasar.framework.aop.interceptors.InterceptorChain">
    <initMethod name="add"><arg>myActionInterceptor</arg></initMethod>
    <initMethod name="add"><arg>traceInterceptor</arg></initMethod>
  </component>

  <!-- DAOの登録 -->
  <component name="hogeDao" instance="request" class="test.apl.HogeDao">
    <aspect pointcut="insert, update">myDaoInterceptor</aspect>
    <aspect>daoInterceptorChain</aspect>
  </component>

  <!-- Serviceの登録 -->
  <component name="hogeService" instance="request" 
class="test.apl.HogeServiceImpl">
    <aspect>myServiceInterceptorChain</aspect>
  </component>

  <!-- Actionの登録 -->
  <component name="hogeAction" instance="request" 
class="test.apl.HogeActionImpl">
    <aspect>myActionInterceptorChain</aspect>
  </component>

  <!-- セッション管理したいコンポーネント -->
  <component name="hogeInfo" class="test.common.HogeInfoImpl" 
instance="session"/>

</components>



--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
 川上 義夫  -  Yoshio Kawakami
 株式会社アイ・ティ・フロンティア 
  コンピテンスセンター 開発技術部
 TEL: 03-6221-7087 FAX: 03-6221-7955
 E-Mail: [E-MAIL ADDRESS DELETED]
--*--*--*--*--*--*--*--*--*--*--*--*--*--*--




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