Jsf CDI:根据调用方在EJB中注入不同的bean

Jsf CDI:根据调用方在EJB中注入不同的bean,jsf,ejb,cdi,Jsf,Ejb,Cdi,我试图在无状态EJB中注入一个bean。但当从ManagedBean或EJB计时器调用EJB时,我希望该bean有所不同 这是我的EJB,我在其中注入了一个用户bean: MyEjb.java 以下是使用EJB的EJB计时器: TimerTest.java 最后,使用MyEjb的ManagedBean: MyManagedBean.java 当达到超时时,我希望MyEbj的foo方法使用由方法produceCurrentUserInEjbTimer创建的系统用户 当调用ManagedBean的b

我试图在无状态EJB中注入一个bean。但当从ManagedBean或EJB计时器调用EJB时,我希望该bean有所不同

这是我的EJB,我在其中注入了一个用户bean:

MyEjb.java

以下是使用EJB的EJB计时器:

TimerTest.java

最后,使用MyEjb的ManagedBean:

MyManagedBean.java

当达到超时时,我希望MyEbj的foo方法使用由方法produceCurrentUserInEjbTimer创建的系统用户


当调用ManagedBean的bar方法时,我希望MyEbj的foo方法使用由方法produceCurrentUserInManagedBean创建的FaceContext的远程用户。

我希望只有一个生产者来检查FaceContext.getCurrentInstance!=空,然后调用适当的代码:

public User produceCurrentUser(){
        if(FacesContext.getCurrentInstance() != null){
            return new User(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());
        }
        else{
             return new User("system");
       }
    }
您还可以将用户直接注入计时器或ManagedBean,然后使用InjectionPoint对象了解用户被注入到哪个类:

public User produceCurrentUser(InjectionPoint injectionPoint){
      System.out.println(injectionPoint.getBean());
}
您还应该使用@Named和@javax.enterprise.context.SessionScoped,因为您的应用程序上有CDI,而不是@ManagedBean

更新

我不确定是否有直接的方法来获取注入的上下文,可能会抛出CDI扩展,但我从未尝试过

通过编程查找获取上下文实例如何:

    @Stateless
class MyEjb{
    @Inject @Any Instance<User> userSource;

    public void foo(String context) // you should define contexts your self as jms, jsf ...
    {
// Every expected context will have a qualifier
      Annotation qualifier = context.equals("jsf") ?
      new JSFQualifier() : new JMSQualifier();
      User p = userSource.select(qualifier).get();
      System.out.println(user);
    }
}

以用户作为参数调用MyEjbfoo不是一个选项吗?不,事实上,我也在拦截器中使用用户。嗯,这是一个解决方案!但是我希望容器根据上下文选择正确的生产者JSF、定时器、JMS、JAXRS等等,不可能吗?我已经用另一个选项更新了帖子,希望它能帮助您。这与将用户对象作为参数传递一样。。。它不会与拦截器一起工作。您在拦截器中看到的用例是什么?我将在名为saveXXX或updateXXX的方法上记录所有用户操作,以在bean上保存用户id
public User produceCurrentUser(){
        if(FacesContext.getCurrentInstance() != null){
            return new User(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());
        }
        else{
             return new User("system");
       }
    }
public User produceCurrentUser(InjectionPoint injectionPoint){
      System.out.println(injectionPoint.getBean());
}
    @Stateless
class MyEjb{
    @Inject @Any Instance<User> userSource;

    public void foo(String context) // you should define contexts your self as jms, jsf ...
    {
// Every expected context will have a qualifier
      Annotation qualifier = context.equals("jsf") ?
      new JSFQualifier() : new JMSQualifier();
      User p = userSource.select(qualifier).get();
      System.out.println(user);
    }
}
@Named
@SessionScoped
class MyManagedBean {
    @EJB
    private MyEjb myEjb;


    public void bar() {
        myEjb.foo("jsf");
    }
}