[Seasar-user:2948] Seasar2.3.1から2.3.3へ移行すると、diconのinitMethodのregisterAllが使えなくなるのでは?(質問)

redrisefirm@kpe.biglobe.ne.jp redrisefirm
2005年 11月 28日 (月) 23:20:58 JST


赤田と申します、はじめて投稿させていただきます。
Seasar2.3.1から2.3.3への移行の際に以下の現象が起きています。
この現象についての解決方法をご存知の方がいらっしゃいましたらご教授してい
ただけないでしょうか?
また、ここがおかしいのではという点を見つけた方もご指摘のほどをお願いします。

●現象:S2Containerを2.3.3へ移行するとコンテナの初期化の際に以下の例外が
発生する。
=====↓スタックトレース=====
org.seasar.framework.exception.NoSuchConstructorRuntimeException:
[ESSR0064]クラス([パッケージ名].[daoインターフェース名])のコンストラクタ([daoインターフェース名]())が見つかりません
at org.seasar.framework.util.ClassUtil.getConstructor(ClassUtil.java:136)
at 
org.seasar.framework.container.assembler.AbstractConstructorAssembler.assembleDefault(AbstractConstructorAssembler.java:89)
at 
org.seasar.framework.container.assembler.AutoConstructorAssembler.doAssemble(AutoConstructorAssembler.java:41)
at 
org.seasar.framework.container.assembler.AbstractConstructorAssembler.assemble(AbstractConstructorAssembler.java:50)
at 
org.seasar.framework.container.deployer.SingletonComponentDeployer.assemble(SingletonComponentDeployer.java:67)
at 
org.seasar.framework.container.deployer.SingletonComponentDeployer.deploy(SingletonComponentDeployer.java:51)
at 
org.seasar.framework.container.deployer.SingletonComponentDeployer.init(SingletonComponentDeployer.java:96)
at 
org.seasar.framework.container.impl.ComponentDefImpl.init(ComponentDefImpl.java:272)
at 
org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:359)
at 
org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:356)
at 
org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:356)
at 
org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:356)
at 
org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:176)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:436)
at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:311)
at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.NoSuchMethodException: [パッケージ名].[daoインターフェース名].<init>()
at java.lang.Class.getConstructor0(Class.java:1937)
at java.lang.Class.getConstructor(Class.java:1027)
at org.seasar.framework.util.ClassUtil.getConstructor(ClassUtil.java:134)
... 21 more
=============================

●以下の環境で実行しています。
・JDK:1.4.2_09
・S2Container:2.3.3
・S2Backport175:2.3.2
・S2Dao:1.0.28

●私の見解
原因を突き止めるために
org.seasar.dao.interceptors.S2DaoInterceptor#invoke(MethodInvocation 
invocation)
の一行目にブレークポイントを張ってみました。
S2Container2.3.1の時は下記設定で飛んできましたが、2.3.3では飛んできません。
よって、コンテナにはインターセプトされてないdaoインターフェースのまま登
録されてしまい、その状態でコンストラクタを呼んだのが、インターフェースだ
からコンストラクタがなくNoSuchMethodExceptionが発生するのではと考えます。
インターフェースがコンテナに登録されることは確認済みです。

●diconとかdaoインターフェースはこうなっています(名前は変えてあります)
=====diconファイル=====
<include path="dao.dicon"/>
<component
class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
<property name="autoNaming">
<component 
class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>
<initMethod name="addClassPattern">
<arg>"[パッケージ名]"</arg>
<arg>".*Dao"</arg>
</initMethod>
<initMethod name="registerAll"/>
</component>

↓includeされているdao.diconより抜粋
<component 
name="interceptor"class="org.seasar.dao.interceptors.S2DaoInterceptor"/>

=====daoインターフェース=====
/**
 * 
@org.seasar.framework.container.annotation.backport175.Component(instance="singleton")
 * 
@org.seasar.framework.container.annotation.backport175.Aspect("dao.interceptor")
 */
public interface [daoインターフェース名] {

    /** BEANアノテーション */
    public Class BEAN = [Beanクラス].class;

    public List getHogeList(String hogeName);

    public [Beanクラス] getHogeDetail(String id, String date);

    /** ARGSアノテーション */
    public static final String getHogeDetail_ARGS = "id,date";
}
==============================

以上、よろしくお願いします。

---
======================================================
  赤田 弘 (Hiroshi Akada)
  E-mail : [E-MAIL ADDRESS DELETED]
======================================================

-------------- next part --------------
HTMLの添付ファイルが除去されました.
URL: http://lists.sourceforge.jp/mailman/archives/seasar-user/attachments/20051128/0ef35d78/attachment.htm



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