SessionScoped cdi观察者与@Inject为生产者bean

时间:2014-09-15 20:43:27

标签: java java-ee cdi wildfly-8

这是我目前的情况:

@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服务器。

1 个答案:

答案 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不起作用。