无法在EJB中应用依赖注入

时间:2013-03-06 09:48:09

标签: java-ee nullpointerexception ejb

我是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;
}

}

2 个答案:

答案 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方法。