【问题标题】:How to call managed bean inside of stateless EJB bean?如何在无状态 EJB bean 中调用托管 bean?
【发布时间】:2013-10-02 06:58:04
【问题描述】:

我想知道,是否有任何选项可以在 EJB bean 中调用托管 bean。想象一下,我们有代码:

@ManagedBean
@SessionScoped
public class MyManagedBean implements Serializable {
  public String getUrl() {
      return "http://www.google.com";
  }
}

@Stateless
public class MyEJB {

  @ManagedProperty(value = "#{myManagedBean}")
  MyManagedBean myManagedBean;

  public void setMyManagedBean(MyManagedBean myManagedBean) {
      this.myManagedBean = myManagedBean;
  }

  public void call() {
      // NullPointerException here
      System.out.println(myManagedBean.getUrl());         
  }
}

我也试过这个:

@Stateless
public class MyEJB {
  @EJB
  MyManagedBean myManagedBean;
  ...
}

...但它返回不同的MyManagedBean 实例。

【问题讨论】:

  • @johny,这不是我的情况:那家伙问如何在托管 bean 中调用 EJB,但我需要在 EJB 中调用托管 bean
  • 不,没有办法。 EJB 容器不知道要注入的 bean 的 JSF 上下文。了解您面临的具体问题将有助于找到有效的替代方案。
  • 为什么要将 jsf bean 注入到无状态 EJB 或任何 EJB 中?
  • @perissf,有一个托管 bean,我在其中存储当前会话的一些数据(用户登录和凭据,如果它确实重要) - 那是“myManagedBean”。 “MyEJB”从数据库返回一些数据。返回什么数据取决于用户帐户类型。

标签: jsf jsf-2 ejb ejb-3.1 managed-bean


【解决方案1】:

这是不对的。使用 CDI 托管 bean 而不是 JSF 托管 bean 是可能的,但它只是不正确,因为设计不好。业务服务根本不应该了解前端。它使业务服务在 JSF 以外的其他前端上无法重用。

你应该反过来做。您应该将 EJB 注入托管 bean,而不是相反。 EJB 应该保持完全无状态。您应该直接将它需要的信息作为方法参数传递给 EJB(并且永远之后将其分配为 EJB 的实例变量)。

例如

@ManagedBean
@SessionScoped // <-- Did you read https://stackoverflow.com/q/7031885?
public class MyManagedBean implements Serializable {

    private String url = "http://www.google.com";

    @EJB
    private MyEJB myEJB;

    public void submit() {
        myEJB.call(url);
    }

    public String getUrl() {
        return url;
    }

}

@Stateless
public class MyEJB {

    public void call(String url) {
        // No NullPointerException here.
        System.out.println(url);
    }

}

另见:

【讨论】:

  • 感谢您的回答。我只是想在您的回复中澄清一些事情:“这不正确”也意味着“这根本不可能”。 ?
  • 我澄清了答案并添加了一个“另见”链接,这应该是阅读和思考的好食物。
  • 好的,我明白了。由于我不使用 CDI,因此可以将问题视为已关闭。谢谢!
  • 即使您使用了 CDI,也不应该这样做。世界上所有自尊的 Java EE 开发人员都会对你大发雷霆。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2015-02-28
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多