Проблема CDI и Обозревателя Java - Когда вызывается метод слушателя, зависимости равны нулю - PullRequest
0 голосов
/ 20 августа 2011

Проблема: когда метод прослушивания вызывается в ContentViewLog, журнал и менеджер сущностей имеют значение null.

BlogDetailBean (бин, используемый на странице JSF2)

@Named
@RequestScoped
public class BlogDetailBean {

    @Inject
    private BlogService blogService;

    @Inject
    Event<ContentViewEvent> blogViewEvent;

    ...

    public String loadEntry(){
      this.blogViewEvent.fire(new ContentViewEvent(this.entry));
    }

    ...

}

ContentViewLog (бин, который слушает ContentViewEvents)

@Stateless
@Named
public class ContentViewLog {

    @Inject
    private Logger log;

    @Inject
    @DataRepository
    private EntityManager em;


    private void listen(@Observes final ContentViewEvent e) {
        this.log.info("Content View Event: " + e.toString());
        final LoggedContentView lcv = new LoggedContentView(e);
        this.em.persist(lcv);
    }

    public Long getTotalViews() {
        final Long result = (Long) this.em.createNamedQuery(
            "loggedContentView.countAll").getSingleResult();
        return result;
}

    ...

}

Кроме того, особенно запутанно то, что другие методы ContentViewLog, такие как getTotalViews, работают при использовании из других bean-компонентов (хотя в этих случаях я не использую события CDI.)

К вашему сведению - есть 2 bean-компонента, не показанных выше, которые используют @Produces для предоставления экземпляров Logger и EntityManager.

1 Ответ

0 голосов
/ 28 августа 2011

Просто выстрел в темноте, поскольку я согласен, что нам нужно знать, какой CDI и контейнер вы используете, но пытались ли вы сделать метод наблюдателя общедоступным, а не закрытым? У меня такое чувство, что в этом случае прокси не будет работать правильно.

...