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.
}
}