1

次のコードでは、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 の問題でしょうか?

ありがとう。

4

2 に答える 2

1

これは Weld のバグです。他のスコープで動作する場合は、Weld と組み合わせたカスタム スコープのバグです。

于 2011-12-12T10:30:02.537 に答える
0

投稿時点での問題についての私の理解は、あまりにも限られた一連の観察に基づいていたことが判明しました - それはすべて間違っていました. 実際の問題は、ジェネリック型パラメーターを受け入れるオーバーロードされたメソッドで @PersistenceContext を使用して、ステートレス ejb にエンティティ マネージャーを正常に挿入できなかったことであることが判明しました。この問題は、glassfish 3.1.2 で修正されたと思われます。例えば:

@Stateless
public class Myejb<T> {

  @PersistenceContext(unitName = "TestPU")
  private EntityManager em;

  public void find(String id) { em.find... }
  public void find(T id) { em.find... }

em find(T id) は null になり、@PersistenceContext と同様に @EJB での注入にも同じ問題があります。本当に大物!

http://java.net/jira/browse/GLASSFISH-17235

于 2011-12-15T09:57:10.013 に答える