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