我是EJB技术的新手,我正在阅读Oracle指南,试图将我所阅读的内容付诸实践。我已经在Eclipse中使用JBoss应用程序服务器创建了一个简单的JSF应用程序,使用Managed Bean作为支持Bean。我想借助Singleton Bean初始化Managed Bean中的数据,只是为了感受Dependency Injection的工作原理。我遵循relevant instructions,但我无法初始化Singleton Bean。应用程序在Hello Managed Bean的构造函数中抛出NPE。我预计我的代码可能缺少一些但我无法找到它。以下Bean类中的缺陷在哪里? :
@Startup
@Singleton
public class LaunchBean {
private List<String> custs;
public List<String> getCusts() {
return custs;
}
public void setCusts(List<String> emps) {
this.custs = emps;
}
@PostConstruct
void init() { //in the guide the () after init is missed, but the code does not compile when omitting it
custs = new ArrayList<String>();
custs.add("Cust1");
custs.add("Cust3");
custs.add("Cust2");
custs.add("Cust4");
}
}
@ManagedBean
@SessionScoped
public class Hello implements Serializable{
@EJB
private LaunchBean dBean;
private static final long serialVersionUID = 1L;
private List<String> customers;
private String customersSelect;
public Hello(){
customers = dBean.getCusts();
}
public List<String> getCustomers() {
return customers;
}
public String getCustomersSelect() {
return customersSelect;
}
public void setCustomersSelect(String customersSelect) {
this.customersSelect = customersSelect;
}
}
答案 0 :(得分:4)
您可以仅使用@EJB
注释将EJB注入其他EJB。 Hello
bean不是EJB。 @ManagedBean
和@SessionScoped
注释都不会成为一个注释。例如,为了使其成为一个,您可以为其添加@Stateless
或@Stateful
注释。
或者,您可以使用CDI将EJB注入到非EJB中,使用@Inject
注释。但是请注意,您将无法利用通过CDI注入的EJB bean的某些EJB功能。
编辑我刚刚注意到代码的另一个问题。注射不仅是错误的。如果您尝试访问注入的成员,那么Hello
bean的构造函数中将始终存在NPE。在构造对象之后注入成员,因此构造函数不可用。要在注入成员后立即使用它们,请使用注释为@PostConstruct
的方法。
编辑2 我已经做了一些SO挖掘,似乎EJB
注入indeed works for ManagedBeans。因此,虽然您无法使用EJB
注释将EJB注入到POJO中,但在这种情况下,不应将ManagedBeans视为POJO :)。抱歉给您带来不便。
答案 1 :(得分:2)
@kostja,
托管bean位于Servlet上下文之上,因此您 CAN 从Managed Bean内部注入EJB。 @arjacsoh。您需要在@PostConstruct方法中包含代码customers = dBean.getCusts();
。您无法在构造函数中执行此操作,因为尚未创建managedbean。在创建Bean之后立即发生@PostConstruct方法。