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更新成员列表。

但我不明白为什么这是在@RequestScopedBean 中完成的。据我了解retrieveAllMembersOrderedByName,每个请求都会调用该方法。这@Observes不应该更好地放在 a@ViewScoped@SessionScopedBean 中吗?它在这种情况下是否有影响?

4

2 回答 2

4

使用@Observesthere 更多的是一个示例,而不是一个真实的实际用例。在您做出回复之前,请考虑成员更改的可能性。我认为如果您将其删除,该网站将无法正常工作。这样想:

当请求开始时,会创建成员列表,其中包含在创建此请求范围 bean 之前的所有成员。稍后,您持久化了一个新成员,因此需要更新此列表以呈现响应。

当您说列表是为每个请求构建的时,您认为是正确的,但是这发生在开始时。添加成员后,您需要刷新它,不是吗?如果此方法不存在,则响应将过时(您将呈现您在持久化新成员之前拥有的列表),并且您将需要一个额外的帖子或获取新的成员列表。

@Observes像观察者模式一样解耦监听器和事件源。因此,如果@Observes不存在,您需要将新成员显式添加到列表中,以便响应正确。

我希望我正确理解了你的问题。

于 2011-07-18T08:37:28.127 回答
1

它是请求范围的,因为它存储每个请求的成员列表。如果您需要按会话存储此列表,请更改它。

但它看起来不对 - 你正在丢弃member观察者方法的参数。

于 2011-07-15T20:23:30.590 回答