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