[英]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.