Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 无法在EJB中应用依赖项注入_Jakarta Ee_Nullpointerexception_Ejb - Fatal编程技术网

Jakarta ee 无法在EJB中应用依赖项注入

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

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

}
@启动
@独生子女
公共类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()。由于尚未创建managedbean,因此无法在构造函数中执行此操作。@PostConstruct方法在创建Bean之后立即发生

@kostja,
托管bean位于Servlet上下文之上,因此您可以从托管bean内部注入EJB@阿贾克索。您需要包含代码
customers=dBean.getCusts()。由于尚未创建managedbean,因此无法在构造函数中执行此操作。@PostConstruct方法在创建Bean之后立即发生

但是,如果我添加注释@Stateless或Stateful,可以将其用作JSF文件的支持Bean吗?我通常可以使用什么作为JSF的支持Bean?@arjacsoh当然,EJB可以作为支持Bean使用,没有任何问题。这并不总是可能的,因为JSF前端通常运行在像Tomcat这样的servlet容器上,而不支持EJB。但是,如果您的前端运行在JavaEE应用服务器上,那就试试吧。我已经尝试过了(改为无状态),但它不能正常工作。它显示的列表框为空,没有数据。单击按钮以删除到下一页后,它会抛出错误:=“#{hello.customersSelect}”:目标不可访问,标识符“hello”解析为null。@arjacsoh我自己使用有状态的EJB作为控制器,因此这确实有效,EL表达式也会被解析。尝试