1

新しいJEE6CDI仕様、特にjsf固有の(レジスタリソース用)および(インジェクション用)アノテーション@Namedに取って代わったと思われるアノテーションと組み合わせた@Injectの使用について質問があります。@ManagedBean@ManagedProperty

Beanクラス" User"に注釈が付けられ@ManagedBean @SessionScopedており、このクラスのオブジェクトが任意のBeanに注入され@ManagedPropertyているとすると、このオブジェクトが作成されて注入されると、セッションにも入れられ、セッションにアクセスして(たとえば、フィルターで)取得できます。使用するオブジェクト:

User user = (User)((HttpServletRequest) request).getSession().getAttribute("user");

したがって、(glassfish 3.1.2で)同じロジックを使用して試してみると、@Named @SessionScopedセッションに@Injectそのようなタイプのオブジェクトがないことを確認できますがUser、これはセッションで見つけたものです。

attribute_name:org.jboss.weld.context.conversation.ConversationIdGenerator    
attribute_value:org.jboss.weld.context.conversation.ConversationIdGenerator@b374765

attribute_name:org.jboss.weld.context.ConversationContext.conversations            
attribute_value:{}

どこが間違っているの?!

4

1 に答える 1

0

Bean に でアノテーションを付けると@SessionScoped、基本的にそのライフサイクルが HttpSession にバインドされます。これは、Bean がセッション オブジェクトに物理的に注入されるという意味ではありません。

@ManagedBean @SessionScoped アノテーションが付けられた Bean クラス「ユーザー」があり、このクラスのオブジェクトが @ManagedProperty を使用して任意の Bean に注入されていると仮定すると、このオブジェクトが作成されて注入されると、セッションにも入れられ、セッションにアクセスできます (フィルターの例)、次を使用してオブジェクトを取得します。

非常に重要: JSF と CDI アノテーションを混在させないでください。JSF テンプレート内からアクセスするすべての Bean を作成@Namedし、CDI と を使用します@Inject@...Scopedこれで十分です。

あなたの質問に答えるには:

@SessionScoped
public class User { ... }


@RequestScoped
public class SomeController { 

@Inject
User user

...
}

これは、セッションの開始時に作成され、インスタンス化されたときにUser挿入されます (この例では、新しいリクエストで)。SomeControllerSomeController

Weld のドキュメントを参照して、そのトピックをより完全に理解してください...

于 2012-04-18T13:43:21.190 に答える