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