Java 会话使用@Inject for producer bean处理cdi观察器

Java 会话使用@Inject for producer bean处理cdi观察器,java,jakarta-ee,cdi,wildfly-8,Java,Jakarta Ee,Cdi,Wildfly 8,这是我目前的情况: @WebListener public class WebListenerService implements HttpSessionListener{ .... implement methods @Produces @Dependent public SessionDependentService sessionDependentService(){ } } @SessionScoped @Named public class AccountControl

这是我目前的情况:

@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.
  }
}
Netbeans正确地将其突出显示为注入点

为什么会这样


我正在使用wildfly 8服务器。

我将producer 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.
 }

}
@无状态
公共类WebListenerSessionService{
//使用实例,因为http会话是动态的。
@注入
私有实例httpSession;
@产生
@依赖的
public SessionDependentService SessionDependentService(){
//使用会话查找现有服务或生成新服务。
}
}
尽管这很好,但CDI规范中没有规定生产者方法必须是会话bean的地方

引述:

生产者方法必须是默认访问、公共、受保护或私有的非抽象方法 托管bean类或会话bean类的。生产者方法可以是静态的,也可以是非静态的- 静止的如果bean是会话bean,那么producer方法必须是 EJB或bean类的静态方法。

既然@SessionScoped是一个托管bean类,为什么将它注入到观察器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.
 }

}