【发布时间】:2014-08-13 12:06:44
【问题描述】:
我正在尝试在无状态 EJB 中注入一个 bean。但是,当从 ManagedBean 或 EJB 计时器调用 EJB 时,我希望该 bean 有所不同。
这是我在其中注入用户 bean 的 EJB:
MyEjb.java
@Stateless
class MyEjb{
@Inject
@CurrentContext
private User user;
public void foo(){
System.out.println(user);
}
}
这是一个使用 EJB 的 EJB 计时器:
TimerTest.java
@Singleton
@Startup
class TimerTest {
@EJB
private MyEjb myEjb;
@Timeout
public void doIt(Timer timer) {
myEjb.foo();
}
@Produces
@CurrentContext
public User produceCurrentUserInEjbTimer(){
return new User("system");
}
}
最后,使用 MyEjb 的 ManagedBean:
MyManagedBean.java
@ManagedBean
@SessionScoped
class MyManagedBean {
@EJB
private MyEjb myEjb;
public void bar() {
myEjb.foo();
}
@Produces
@CurrentContext
@RequestScoped
public User produceCurrentUserInManagedBean(){
return new User(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());
}
}
当达到超时时,我希望 MyEbj 的 foo 方法使用由方法produceCurrentUserInEjbTimer 创建的系统用户。
当调用 ManagedBean 的 bar 方法时,我希望 MyEbj 的 foo 方法使用 FaceContext 的远程用户(由方法 createCurrentUserInManagedBean 创建)。
【问题讨论】:
-
并且不能以用户为参数调用
MyEjb#foo? -
不,其实我也在拦截器中使用用户。