-1

我想知道,是否有任何选项可以在 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实例。

4

1 回答 1

3

这个不对。使用 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);
    }

}

也可以看看:

于 2013-09-26T11:40:34.843 回答