Проблема: когда метод прослушивания вызывается в 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.