クリエータで自動登録されたコンポーネントの DI ってどうするんだろう
要約するとタイトル通り。
事の発端は、Seasar の認証系プロダクトな S2AnA を試してみようと、いろいろ弄ってたところでして。
認証やロールの判別を行うのは AuthenticationContext を実装したクラスなんだなということで、今作っているツール用に自前で HogeAuthenticationContext なるものを作り、s2ana.dicon に component 定義書いて、customizer.dicon に Page クラスへ requireLogin なインターセプタを噛ませるよう書いてみました。
ちなみに、HogeAuthenticationContext は S2Dao を使った DAO クラスがフィールドへインジェクションされることを期待したクラスになってます。
いろいろ端折ってますが、ソースとしては、下のような感じ。
package foo.bar.security; public class HogeAuthenticationContext implements AuthenticationContext { public HogeDao dao; public Principal getUserPrincipal() { } public boolean isUserInRole(String roleName) { } public boolean isAuthenticated() { // HogeDao 使って、ユーザ情報が DB にあるかどうか確認 } }
しかし、この状態で適当な Page クラスへアクセスしたところ、HogeDao がインジェクションされず、null のまま処理を行おうとしちゃったり・・・。
やっぱり SMART deploy のパッケージ規約だかなんだかで、それっぽい場所に置いとくほうがいいのかな〜とか思って service パッケージなんかに放り込んでクラス名の suffix を Service なんかにしたりして、AuthenticationContextResolver を自作したりなんかしたりしても、HogeDao はインジェクションされるようになりましたが、今度は自作の AuthenticationContextResolver が、この HogeAuthenticationContext が見つからないだとかなんだとかで・・・なんだかもう、アレです。
dicon の書く場所が悪かったりするんでしょうか・・・。
もしくは、以前 koichik 氏が似たようなことで指摘していただいた、フィールド名はクラス名の頭1文字を小文字にする、とかなんでしょうか。
でも、DAO ってフィールド名が違ってもインジェクションされますよね・・・。
ちょっと、お手上げ状態です。