4

私はアーキタイプを持っておりorg.jboss.weld.archetypes:jboss-javaee6-webapp:1.0.1.CR2、クラスを理解しようとしていますMemberListProducer:

@RequestScoped
public class MemberListProducer
{
  @Inject @MemberRepository private EntityManager em;

  private List<Member> members;
  @Produces @Named public List<Member> getMembers() {return members;}

  public void onMemberListChanged(@Observes(notifyObserver = Reception.IF_EXISTS)
                                  final Member member){
    retrieveAllMembersOrderedByName();
  }

  @PostConstruct
  public void retrieveAllMembersOrderedByName()
  {
    //Criteria Query to fetch all members
    members = em.createQuery(criteria).getResultList();
  }
}

オブザーバーは、別のクラスから呼び出されますmemberEventSrc.fire(newMember);。これは明らかです。一度起動されるとMemberListProducer、メンバーのリストが更新されます。

@RequestScopedしかし、これがBeanで行われる理由がわかりません。私の理解では、メソッドretrieveAllMembersOrderedByNameはとにかく各リクエストによって呼び出されます。これはor Bean@Observesに配置したほうがよいのではないでしょうか? この場合、それはまったく効果がありますか?@ViewScoped@SessionScoped

4

2 に答える 2

4

thereの使用は@Observes、実際の実用的な使用例というよりも例です。応答をレンダリングする前に、メンバーが変更される可能性を考慮してください。削除すると、ウェブサイトが正しく機能しないと思います。次のように考えてください。

リクエストが開始されると、メンバーのリストが作成され、このリクエスト スコープ Bean の作成時点までのすべてのメンバーが含まれます。後で新しいメンバーを永続化するため、このリストを更新して応答をレンダリングする必要があります。

リクエストごとにリストが作成されると言うのは正しいと思いますが、これは最初に起こります。メンバーを追加したら、更新する必要がありますね。このメソッドが存在しない場合、応答は古くなり (新しいメンバーを永続化する前に持っていたリストをレンダリングすることになります)、追加の投稿が 1 つ必要になるか、メンバーの新しいリストを取得する必要があります。

@Observesオブザーバー パターンと同様に、リスナーとイベント ソースを切り離します。したがって、@Observesそこにない場合は、新しいメンバーをリストに明示的に追加して、応答が正しくなるようにする必要があります。

あなたの質問を正しく理解できたことを願っています。

于 2011-07-18T08:37:28.127 に答える
1

リクエストごとにメンバーのリストを保存するため、リクエスト スコープです。このリストをセッションごとに保存する必要がある場合は、変更してください。

しかし、それは間違っているように見えます-memberオブザーバーメソッドの引数を破棄しています。

于 2011-07-15T20:23:30.590 に答える