1

私はCDIを初めて使用し、これをJSF2アプリケーションに使用したいと考えています。クラスMyUserは単純な@Entity-Beanであり、オブジェクトは@PostConstructBeanのメソッドで作成されます。

@Stateful
@Named @javax.faces.bean.SessionScoped
public class UserBean implements Serializable
{
    @Named
    private MyUser user;

    //setter and getter
    //@PostConstruct
}

JSFページでユーザーにアクセスすることは、魅力のように機能します#{user.lastName}。しかし今、私は他のBeanからこのオブジェクトにアクセスしたいと思います@ViewScopedBean

@Named @javax.faces.bean.ViewScoped
public class TestBean implements Serializable
{       
    @Inject private MyUser user;
}

現在の(ログインしている)MyUser userものを他のいくつかのBeanで使用できるようにしたいのですが、これを行う方法がわかりません。単純@Injectにそれを実行しても機能しませんでした(そして、これは単純なものに少しなります)。

13:56:22,371 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController]
Error installing to Start: name=vfs:///Applications/Development/
jboss-6.0.0.Final/server/default/deploy/test.ear_WeldBootstrapBean state=Create:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied
dependencies for type [MyUser] with qualifiers [@Default] at injection
point [[field] @Inject private test.controller.mbean.TestBean.user]

user他のBeanからにアクセスするための最良のアプローチは何ですか?JSF1.2スタイルのコードはUserBean bean = (UserBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("UserBean");昔ながらのようです!

4

3 に答える 3

4

まず第一に:あなたはエンティティを直接注入したくありません。エンティティは、ORMフレームワークによってかなり独立して制御され、独自のライフサイクルを持っています。それらをマネージドBeanとして使用しないでください。

この定義によれば、JPAエンティティは技術的に管理されたBeanです。ただし、エンティティには独自の特別なライフサイクル、状態、およびIDモデルがあり、通常はJPAまたはnewを使用してインスタンス化されます。したがって、エンティティクラスを直接注入することはお勧めしません。JPAは注入されたCDIプロキシを永続化できないため、@Dependent以外のスコープをエンティティクラスに割り当てることは特にお勧めしません。

詳細はこちらをご覧ください。

あなたの質問に答えるには:(認証された)ユーザーのようなものを「排除」することはできません。これはSeam 2で可能でしたが、CDIのプロキシメカニズム全体ではこれが許可されなくなりました。あなたがする必要があるのは次のとおりです。

  • 認証を処理するマネージドBeanを作成し、それを正しいスコープ(おそらくセッションスコープ)に配置します。
  • ログインが成功した場合は、このBeanの属性を使用して、認証されたユーザーを保存します。
  • プロデューサーメソッド(おそらくのような修飾子を@LoggedIn使用)を使用して、ユーザーをアプリケーションで使用できるようにします

次のようにユーザーを挿入します。

@Inject
@LoggedIn
private User user

それがCDIの方法です;-)

于 2011-06-15T08:36:59.173 に答える
0

@InjectedBeanも@NamedBeanですか?

そうである場合、MyUserBeanのスコープはTestBeanよりも小さくなります。@ViewScoped Beanの管理プロパティは、@ ViewScoped、@ SessionScoped、または@ApplicationScopedである必要があることに注意してください。

于 2011-06-14T12:37:33.787 に答える
0

@ViewScopedCDIは注釈を指定しません。これはJSF2アノテーションです。許可される注釈は、:、、、、および@RequestScopedのみです。最初の3つは、CDIで許可されている唯一のJSFスコープです。@SessionScoped@ApplicationScoped@Dependent@ConversationScoped

注釈をサポートする必要がある場合@ViewScopeは、自分で作成する必要があります。幸いなことに、他の誰かが以前にこれを行ったことがある。

于 2011-06-14T12:38:01.380 に答える