繁体   English   中英

如何在无状态EJB bean中调用托管bean?

[英]How to call managed bean inside of stateless EJB bean?

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

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

}

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM