北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

S2Containerで遊ぼうとしました

Seasar2(S2.4.0-rc-1)を拾って来て、遊ぼうと思ったんですが。めんどくさいからEmacsでpackage指定なしのサンプルコードをちょちょちょいっと書いたんですが、FileSystemComponentAutoRegisterはカレントディレクトリ以下のクラスを検索するって荒業には対応してないみたいですね。ダイコンに、

<initMethod name="addClassPattern">
    <arg>""</arg>
    <arg>".*Impl"</arg>
</initMethod>

と書いてカレントディレクトリにあるデフォルトパッケージを検索させようとすると、*.classファイルの検索まではうまくいくみたいですが、クラスのregist時にClassNotFoundExceptionを投げてきます。クラス名にパッケージ名をつけるときに使っているClassUtil#concatNameが空文字列に対応しておらず、空文字も'.'で接続してしまっているのが原因ですかね?*1

たとえば、カレントにMyTestImpl.classがあると、最終的にClass#forNameで探されるクラスは".MyTestImpl"と先頭に余分なドットがくっついちゃってまずーな感じになりそうです。

一方、

<initMethod name="addClassPattern">
    <arg></arg>
    <arg>".*Impl"</arg>
</initMethod>

と記述すると、パッケージ名に対してstartWith()を呼ぶ箇所*2があるのでぬるぽ。これ以外の指定方法はちょっと思いつきませんでした。

まあ、あくまでも荒業だからできなくても誰も困らないんでしょうけど(笑)。





ところで、

<property name="autoNaming">
	<component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>

って省略できなかったんでしたっけ? これないとエラーになってしまいました。

*1:nullには対応している

*2:ClassPattern#isAppliedPackageName