次のコードでは、SessionScoped Bean をステートレス EJB に注入しようとしていますが、EJB の抽象基本クラスで @Inject を実行したいと考えています。CDI仕様によると、これはうまくいくはずだと示唆しているようです(決して言葉を無駄にする仕様ではありません):
「4.2.会員レベルのメタデータの継承
クラス X がマネージド Bean またはセッション Bean Y の Bean クラスによって直接的または間接的に拡張されているとします。
X が注入されたフィールド x を宣言すると、Y は x を継承します。」
何が起こるかというと、継承された保護されたメンバー sessionView に TestEjb からアクセスできますが、基本クラス内のコードからはアクセスできません。「アクセスできる」とは、挿入されたメンバーが実行時にアクセス可能で、null でないことを意味します。
@Named
@ViewAccessScoped
public class JsfBean extends implements Serializable {
@Inject private TestEjb ejb;
SessionView s1 = ejb.getSessionViewChild(); // sessionView injected ok
SessionView s2 = ejb.getSessionViewBase(); // sessionView is null
}
@Named
@SessionScoped
public class SessionView implements Serializable {}
@Stateless
public class TestEjb extends BaseClass implements Serializable {
public SessionView getSessionViewChild() {
return sessionView;
}
}
public abstract class BaseClass implements Serializable {
@Inject
protected SessionView sessionView;
public SessionView getSessionViewBase() {
return sessionView;
}
}
s1 は有効な SessionView 参照ですが、s2 は null です。
Glassfish 3.1.1 の Weld と組み合わせて MyFaces CODI 1.01 を使用しています。BaseClass から抽象を削除しようとし、さらに @Named を追加しようとしましたが、これは役に立たず、何が間違っているのかわかりません。
現状では、基本クラスから sessionView を継承し、それをパラメーターとして基本クラスのメソッドに戻す必要があるようです。だから、私が何かばかげたことをしているのか、誰かが指摘してくれるとありがたいです。おそらくこれは CODI/Weld の問題でしょうか?
ありがとう。