[Seasar-user:5455] ComponentAutoRegisterでパッケージ名前方一致のClassPatternを複数登録したときの挙動について

Hidenoshin Yoshida [E-MAIL ADDRESS DELETED]
2006年 12月 14日 (木) 03:25:06 JST


吉田です。

S2.3.8を業務で利用しているのですが
ComponentAutoRegisterの自動設定で、同一クラスが
複数登録されてしまう現象が発生しました。

バージョンが古いせいかと思いましたので、最新のS2.4.6でも
試してみたところ、よく似た現象が発生しましたので
MLに報告させていただきたいと思います。
(一応検索はしたのですが、もし既出でしたらすみません)

ルートパッケージとして
・example
・example2

のようなパターンが存在するとします。
example.daoパッケージにDaoインターフェイスが一つ
example.dao.implパッケージにその実装が一つ
example2.daoパッケージにDaoインターフェイスが一つ
example2.dao.implパッケージにその実装が一つ

・・・のような形で、一つのインターフェイスに一つずつ
実装を作成し、ComponentAutoRegisterで自動登録させようと
しています。

このときに、ClassPatternを

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

のような形で登録すると、example2のDaoを呼ぼうとしたときに
TooManyRegistrationRuntimeExceptionが発生しました。
デバッグモードで調べてみたところ、
ClassPattern.isAppliedPackageNameの中で、パッケージ名が

pName.startsWith(packageName);

としてチェックされている為、パッケージ名としては別でも
文字列として前方一致するようなクラスパターンを複数登録している場合、
Componentも複数登録されてしまうようです。
定義するルートパッケージがディレクトリ名と一致しないと自動登録
できませんので、この場合exampleとexample2のルートパッケージは
同時には設定できませんでした。
(ComponentAutoRegisterをルートパッケージ毎に複数登録すれば
当現象は発生しませんでした。)

業務的には、現在はエラーが起こったクラスが存在しなくなった為、
問題とはなっておりません。

ただ、現在運用中のシステムは今後もS2.3を使い続ける予定の為、
この現象に対する対処を確認させていただければと思います。
AbstractComponentAutoRegister.processClassの中で
register処理を一度しか実行されないように
修正して頂くことは可能でしょうか?


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

-- 
吉田秀之進
[E-MAIL ADDRESS DELETED]



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