[Seasar-user:3745] インナークラスを持つコンポーネントの自動登録
Kaisei HAMAMOTO
[E-MAIL ADDRESS DELETED]
2006年 6月 3日 (土) 10:22:13 JST
浜本です。お世話になっております。
S2Containerでコンポーネントを自動登録する際、以下の状況でエラーが
発生します。
・登録対象のクラスが、以下のいずれかのインナークラスを持っている
- private または protected な static インナークラス
- 非 static インナークラス
・インナークラス名も登録対象クラスパターンに合致する
[再現例]
次のようなクラスを用意します。
package test;
public class Aaa {
private static class Bbb {
}
}
このクラスを、以下のdiconファイル記述で自動登録します。
<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"</arg>
<arg>".*"</arg>
</initMethod>
</component>
すると、以下の例外が発生します。
Exception in thread "main" org.seasar.framework.exception.NoSuchConstructorRuntimeException:
[ESSR0064]クラス(test.Aaa$Bbb)のコンストラクタ(Aaa$Bbb())が見つかりません
at org.seasar.framework.util.ClassUtil.getConstructor(ClassUtil.java:135)
at org.seasar.framework.container.assembler.AbstractConstructorAssembler.assembleDefault(AbstractConstructorAssembler.java:89)
at org.seasar.framework.container.assembler.AutoConstructorAssembler.doAssemble(AutoConstructorAssembler.java:40)
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:97)
at org.seasar.framework.container.impl.ComponentDefImpl.init(ComponentDefImpl.java:284)
at org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:396)
at test.Test.main(Test.java:43)
Caused by: java.lang.NoSuchMethodException: test.Aaa$Bbb.<init>()
at java.lang.Class.getConstructor0(Class.java:2647)
at java.lang.Class.getConstructor(Class.java:1629)
at org.seasar.framework.util.ClassUtil.getConstructor(ClassUtil.java:133)
... 9 more
これはもちろん、クラスパターンをインナークラス名に合致しないよう変更
することで回避できますが、上記ケースのインナークラスを自動登録の対象
から外すように対処していただければ嬉しく思います。
なお、私の環境はS2Container 2.3.9です。
よろしくお願いいたします。
Seasar-user メーリングリストの案内