这是我目前的情况:
@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 已正确注入且不为null,而在 AccountObserver 中,它始终为null。
修改: 使用参数注入的事件仍然会产生空值。
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服务器。
答案 0 :(得分:0)
我将生产者bean从SessionScoped更改为无状态bean:
@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规范中没有任何地方说生产者方法必须是会话bean。
引用:
生产者方法必须是默认访问,公共,受保护或私有,非抽象方法 托管bean类或会话bean类的。生产者方法可以是静态的也可以是非 静态的。如果bean是会话bean,那么producer方法必须是一个business方法 EJB或bean类的静态方法。
由于@SessionScoped是一个托管bean类,为什么注入观察者bean不起作用。