Jakarta ee 无法在EJB中应用依赖项注入
我是EJB技术的新手,目前正在阅读Oracle指南,试图将所读内容付诸实践。为此,我在Eclipse中使用JBoss应用服务器创建了一个简单的JSF应用程序,使用托管Bean作为支持Bean。我想借助一个单例Bean来初始化托管Bean中的数据,只是想了解依赖注入是如何工作的。我遵循,但是我无法初始化单例Bean。应用程序在Hello托管Bean的构造函数中抛出一个NPE。我预计我的代码可能缺少一些东西,但我无法找到它。以下Bean类中的缺陷在哪里Jakarta ee 无法在EJB中应用依赖项注入,jakarta-ee,nullpointerexception,ejb,Jakarta Ee,Nullpointerexception,Ejb,我是EJB技术的新手,目前正在阅读Oracle指南,试图将所读内容付诸实践。为此,我在Eclipse中使用JBoss应用服务器创建了一个简单的JSF应用程序,使用托管Bean作为支持Bean。我想借助一个单例Bean来初始化托管Bean中的数据,只是想了解依赖注入是如何工作的。我遵循,但是我无法初始化单例Bean。应用程序在Hello托管Bean的构造函数中抛出一个NPE。我预计我的代码可能缺少一些东西,但我无法找到它。以下Bean类中的缺陷在哪里 @Startup @Singleton pub
@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;
}
}
@启动
@独生子女
公共类LaunchBean{
私人名单客户;
公共列表getCusts(){
归还客户;
}
公共无效SETCUST(列出EMP){
this.custs=emps;
}
@施工后
void init(){//在指南中,init之后的()将丢失,但忽略它时代码不会编译
custs=newarraylist();
客户添加(“客户1”);
客户添加(“客户3”);
客户添加(“客户2”);
客户添加(“客户4”);
}
}
@ManagedBean
@会议范围
公共类Hello实现了可序列化{
@EJB
私有LaunchBean dBean;
私有静态最终长serialVersionUID=1L;
私人名单客户;
私有字符串customerselect;
公众你好{
customers=dBean.getCusts();
}
公共列表getCustomers(){
返回客户;
}
公共字符串getCustomerSelect(){
返回客户选择;
}
公共无效设置CustomerSelect(字符串CustomerSelect){
this.customersSelect=customersSelect;
}
}
您只能使用@EJB
注释将EJB注入其他EJB。Hello
bean不是EJB。无论是@ManagedBean
还是@SessionScoped
注释都不能将其作为一个对象。例如,为了使其成为一个,您可以向其添加一个@无状态
或@有状态
注释
或者,您可以使用CDI将EJB注入到非EJB中,使用@inject
注释。但是请注意,您将无法利用通过CDI注入的EJB bean的某些EJB特性
编辑我刚刚注意到代码的另一个问题。错误的不仅仅是注射。如果您试图访问注入的成员,那么Hello
bean的构造函数中总会有一个NPE。成员在对象构造之后被注入,因此构造函数不可用。要在注入成员后立即使用它们,请使用带有@PostConstruct
注释的方法
edit2我做了一些挖掘工作,看起来像是
EJB
注入。所以,虽然不能使用EJB
注释将EJB注入POJO,但在本例中,ManagedBeans不应被视为POJO:)。很抱歉给您带来不便。您只能使用@EJB
注释将EJB注入其他EJB。Hello
bean不是EJB。无论是@ManagedBean
还是@SessionScoped
注释都不能将其作为一个对象。例如,为了使其成为一个,您可以向其添加一个@无状态
或@有状态
注释
或者,您可以使用CDI将EJB注入到非EJB中,使用@inject
注释。但是请注意,您将无法利用通过CDI注入的EJB bean的某些EJB特性
编辑我刚刚注意到代码的另一个问题。错误的不仅仅是注射。如果您试图访问注入的成员,那么Hello
bean的构造函数中总会有一个NPE。成员在对象构造之后被注入,因此构造函数不可用。要在注入成员后立即使用它们,请使用带有@PostConstruct
注释的方法
edit2我做了一些挖掘工作,看起来像是EJB
注入。所以,虽然不能使用EJB
注释将EJB注入POJO,但在本例中,ManagedBeans不应被视为POJO:)。很抱歉给您带来不便。@kostja,
托管bean位于Servlet上下文之上,因此您可以从托管bean内部注入EJB@阿贾克索。您需要包含代码customers=dBean.getCusts()@PostConstruct方法中的code>。由于尚未创建managedbean,因此无法在构造函数中执行此操作。@PostConstruct方法在创建Bean之后立即发生 @kostja,
托管bean位于Servlet上下文之上,因此您可以从托管bean内部注入EJB@阿贾克索。您需要包含代码customers=dBean.getCusts()@PostConstruct方法中的code>。由于尚未创建managedbean,因此无法在构造函数中执行此操作。@PostConstruct方法在创建Bean之后立即发生 但是,如果我添加注释@Stateless或Stateful,可以将其用作JSF文件的支持Bean吗?我通常可以使用什么作为JSF的支持Bean?@arjacsoh当然,EJB可以作为支持Bean使用,没有任何问题。这并不总是可能的,因为JSF前端通常运行在像Tomcat这样的servlet容器上,而不支持EJB。但是,如果您的前端运行在JavaEE应用服务器上,那就试试吧。我已经尝试过了(改为无状态),但它不能正常工作。它显示的列表框为空,没有数据。单击按钮以删除到下一页后,它会抛出错误:=“#{hello.customersSelect}”:目标不可访问,标识符“hello”解析为null。@arjacsoh我自己使用有状态的EJB作为控制器,因此这确实有效,EL表达式也会被解析。尝试