2014-09-15 5 views
0

Это мой текущий сценарий:SessionScoped КДИ наблюдатель с @Inject для производителей фасоли

@WebListener 
public class WebListenerService implements HttpSessionListener{ 
.... implement methods 

@Produces 
@Dependent 
public SessionDependentService sessionDependentService(){ 
} 

} 

@SessionScoped 
@Named 
public class AccountController implements Serializable{ 

    //Injected properly and works as expected 
    @Inject 
    private SessionDependnetService sessionDependentService; 
    @Inject 
    @OnLogin 
    private Event<Account> accountEvent; 

    public void onLogin(){ 
    accountEvent.fire(authenticatedAccount); 
    } 
} 

@SessionScoped 
public class AccountObserver implements Serializable{ 

    //This does not work. It is always null. 
    @Inject 
    private SessionDependnetService sessionDependentService; 

    public void onLoginEvent(@Observes @OnLogin final Account account) { 
    //When this methods is invoked 
    //the sessiondependentservice is always null here. 
    } 
} 

В AccountController, то SessionDependentService правильно введен и не равно нулю, в то время как в AccountObserver, он всегда равен нулю.

EDIT: Событие, использующее инъекцию параметров, по-прежнему приводит к нулевому значению.

public void onLoginEvent(@Observes @OnLogin final Account account, final SessionDependnetService sessionDependentService) { 
    //When this methods is invoked 
    //the sessiondependentservice is always null here. 
    } 

Netbeans правильно подсвечивает это как точку впрыска.

Почему это так?

Я использую wildfly 8 server.

ответ

0

Я изменил продюсер боб от SessionScoped к Stateless фасоли:

не
@Stateless 
public class WebListenerSessionService { 

//Use Instance since http session are dynamic. 
@Inject 
private Instance<HttpSession> httpSession; 

@Produces 
@Dependent 
public SessionDependentService sessionDependentService(){ 
    //use session to lookup existing service or produce a new one. 
} 

} 

Несмотря на то, что это работает хорошо, нет, где в спецификации CDI, который говорит, что метод Производитель должен быть сессионные компоненты.

процитировать:

метод

Производитель должен быть по умолчанию доступа, общественный, защищенный или частный, не абстрактный метод класса фасоли класса управляемых фасоли или сеанса. Способ изготовления может быть статическим или не статическим. Если компонент является сессионным компонентом, метод производителя должен быть либо бизнес-методом EJB, либо статическим методом класса bean.

А поскольку @SessionScoped - это управляемый компонент bean, почему бы ему не вставить в bean-компонент наблюдателя.

Смежные вопросы