[Seasar-user:10790] S2Containerの使い方について

的場 大輔 [E-MAIL ADDRESS DELETED]
2007年 10月 1日 (月) 14:58:59 JST


お世話になります。まとばと申します。

次のような環境で開発をしております。
s2-framework 2.4.13
teeda-core 1.0.7
s2-dao 1.0.43

一覧表示をする画面を作成しているのですが、
画面上に置いた「一覧表示」ボタンをクリックすると、
あるテーブルの内容を一覧表示する画面を作成しているのですが、
一覧表示ボタンを、2回連続でクリックするとエラーが発生しています。
2回連続でと言っても、一度ちゃんと一覧がでてから他の処理をすることなく
もう一度同じボタンをクリックするという動作です。

一覧表示後に、他のDBにアクセスするような動作をしてから再度「一覧表示」ボタンを
クリックする場合には、この現象は発生しません。


一覧表示時に実行される処理---------------------------------------
public Class doListShow(){
S2Container container = S2ContainerFactory.create(DiconConst.MST_ROLE_DICON_PATH);
IMstRoleDao roleDao = (IMstRoleDao)container.getComponent(IMstRoleDao.class);
				
// 一覧取得処理
List<FindMstRoleDto> roleList = roleDao.getList((MstSearchDto)mstPageControlDto);

return null;
}
-------------------------------------------------------------------------------------

Diconファイル--------------------------------------------------
<components>
	<include path="dao.dicon"/>
	<component class="xxx.IMstRoleDao">
		<aspect>dao.interceptor</aspect>
	</component>
</components>
-------------------------------------------------------------------------

エラーの発生しているのは、containerからIMstRoleDaoを取得しているところで、
エラー内容はキャストエラーのようです。
そこで、コンテナーからの戻り値を一度Object型に詰めてそれからキャストするようにし、
エラーになるときとならないときの戻り値(aaa)を確認してみました。

【変更後ソース】
S2Container container = S2ContainerFactory.create(DiconConst.MST_ROLE_DICON_PATH);
Object aaa = container.getComponent(IMstRoleDao.class);
IMstRoleDao roleDao = (IMstRoleDao)aaa;

成功時:"aaa"= IMstRoleDao$$EnhancedByS2AOP$$1ccf342  (ID=138)	
エラー時:"aaa"= IMstRoleDao$$EnhancedByS2AOP$$1ccbefe  (ID=156)

エラーの内容----------------------------------------------------
xxx.IMstRoleDao$$EnhancedByS2AOP$$a47962
java.lang.ClassCastException: jp.co.takeit.tisales.dao.master.IMstRoleDao$$EnhancedByS2AOP$$a47962
  at xxx.MstRoleListPage#getMstRoleList (MstRoleListPage.java#322)
  at xxx.MstRoleListPage#doSearch (MstRoleListPage.java#432)
  at xxx.MstRoleListPage$$EnhancedByS2AOP$$12be8e1#$$doSearch$$invokeSuperMethod$$ (MstRoleListPage$$EnhancedByS2AOP$$12be8e1.java)
  at xxx.MstRoleListPage$$EnhancedByS2AOP$$12be8e1$$MethodInvocation$$doSearch3#proceed (MethodInvocationClassGenerator.java)
  at org.seasar.framework.aop.interceptors.ThrowsInterceptor#invoke (ThrowsInterceptor.java#73)
  at xxx.MstRoleListPage$$EnhancedByS2AOP$$12be8e1$$MethodInvocation$$doSearch3#proceed (MethodInvocationClassGenerator.java)
  at xxx.MstRoleListPage$$EnhancedByS2AOP$$12be8e1#doSearch (MstRoleListPage$$EnhancedByS2AOP$$12be8e1.java)
  at sun.reflect.NativeMethodAccessorImpl#invoke0 (NativeMethodAccessorImpl.java)
  at sun.reflect.NativeMethodAccessorImpl#invoke (NativeMethodAccessorImpl.java#39)
  at sun.reflect.DelegatingMethodAccessorImpl#invoke (DelegatingMethodAccessorImpl.java#25)
  at java.lang.reflect.Method#invoke (Method.java#585)
  at org.seasar.framework.util.MethodUtil#invoke (MethodUtil.java#49)
  at org.seasar.framework.beans.impl.BeanDescImpl#invoke (BeanDescImpl.java#213)
  at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl#invoke (HtmlComponentInvokerImpl.java#159)
  at org.seasar.teeda.extension.html.impl.HtmlActionListener#processAction (HtmlActionListener.java#62)
  at javax.faces.component.UICommand#broadcast (UICommand.java#149)
  at org.seasar.teeda.extension.component.html.THtmlCommandButton#broadcast (THtmlCommandButton.java#53)
  at javax.faces.component.UIViewRoot#broadcastEvents (UIViewRoot.java#192)
  at javax.faces.component.UIViewRoot#processApplication (UIViewRoot.java#117)
  at org.seasar.teeda.core.lifecycle.impl.InvokeApplicationPhase#executePhase (InvokeApplicationPhase.java#29)
  at org.seasar.teeda.core.lifecycle.AbstractPhase#execute (AbstractPhase.java#55)
  at org.seasar.teeda.core.lifecycle.LifecycleImpl#execute (LifecycleImpl.java#94)
------------------------------------------------------------------------------

成功時、失敗時のコンテナからの戻り値にどのような違いがあるのかが、
把握できません。
何か、致命的な見落としがあるのではないかと思っているのですが、
自分で見つけることができていません。
お手数お掛けして申し訳ございませんが、ご教授いただけませんでしょうか。

以上、宜しくお願い致します。





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