1

我是 EJB 技术的新手,我目前正在阅读 Oracle 指南,试图将我阅读的内容付诸实践。为此,我在 Eclipse 中使用 JBoss 应用程序服务器创建了一个简单的 JSF 应用程序,使用托管 Bean 作为支持 Bean。我想借助 Singleton Bean 来初始化 Managed Bean 中的数据,只是为了感受下依赖注入是如何工作的。我按照相关说明进行操作,但无法初始化 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;
}

}
4

2 回答 2

4

您只能使用@EJB注解将 EJB 注入到其他 EJB 中。Hellobean 不是 EJB 。和注释都@ManagedBean没有@SessionScoped使它成为一个。为了使其成为一体,例如,您可以为其添加一个 @Stateless或一个@Stateful注释。

@Inject或者,您可以使用 CDI 使用注释将 EJB 注入到非 EJB 中。但是请注意,您将无法利用通过 CDI 注入的 EJB bean 来利用某些 EJB 功能。

编辑我刚刚注意到代码的另一个问题。错误的不仅仅是注射。Hello如果您尝试在那里访问注入的成员,那么 bean 的构造函数中总会有一个 NPE 。成员在对象构造之后注入,因此构造函数不可用。要在注入成员后立即使用它们,请使用带有注释的方法@PostConstruct

编辑 2我做了一些挖掘工作,看起来EJB注入 确实适用于 ManagedBeans。因此,虽然您不能使用注释将 EJB 注入 POJO,但EJB在这种情况下,ManagedBeans 不应被视为 POJO :)。我很抱歉给您带来不便。

于 2013-03-06T09:54:42.910 回答
2

@kostja,托管 bean 位于 Servlet 上下文之上,因此您可以从托管 Bean 内部注入 EJB。@arjacsoh。您需要customers = dBean.getCusts();在 @PostConstruct 方法中包含代码。您不能在构造函数中执行此操作,因为还没有创建 managedbean。@PostConstruct 方法在创建 Bean 后立即发生。

于 2013-03-06T11:05:46.733 回答