JavaEE и CDI: понимание @Observe - PullRequest
2 голосов
/ 12 июля 2011

У меня есть архетип 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 Бобе.В моем понимании метод retrieveAllMembersOrderedByName в любом случае вызывается каждым запросом.Разве это @Observes не должно быть лучше помещено в @ViewScoped или @SessionScoped Bean?Имеет ли это влияние в этом случае вообще?

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Использование @Observes - это больше пример, чем реальный, практический пример использования. Рассмотрите возможность смены участников, прежде чем вы предоставите свой ответ. Я не думаю, что сайт будет работать правильно, если вы удалите его. Думайте об этом так:

Когда запрос запускается, создается список участников, в котором содержатся все члены до момента создания этого bean-объекта области действия запроса. Позже вы сохраняете нового участника, поэтому этот список необходимо обновить, чтобы получить ответ.

Вы правильно думаете, когда говорите, что список создается для каждого запроса, однако это происходит в начале. После того, как вы добавили участника, вам нужно обновить его, не так ли? Если бы этого метода не было, ответ был бы устаревшим (вы бы отобразили список, который у вас был до того, как вы сохранили нового участника), и вам понадобился бы один дополнительный пост или возможность получить новый список участников.

@Observes разъединяет слушателей и источники событий так же, как шаблон наблюдателя. Поэтому, если @Observes нет, вам нужно явно добавить нового члена в список, чтобы ответ был правильным.

Надеюсь, я правильно понял ваш вопрос.

0 голосов
/ 16 июля 2011

Это область действия запроса, потому что она хранит список членов для запроса. Если вам нужно, чтобы этот список хранился за сеанс, измените его.

Но это выглядит неправильно - вы отбрасываете member аргументы метода наблюдателя.

...