我想在ManagedBean中使用@Inject或@Produce注解将CDI Bean注入。我使用的CDI Bean是:
@Named
@Startup
@ApplicationScoped
public class BaseBean {
private List<String> custs;
public List<String> getCusts() {
return custs;
}
public void setCusts(List<String> emps) {
this.custs = emps;
}
public BaseBean(){
}
@PostConstruct
void init() {
custs = new ArrayList<String>();
custs.add("Cust1");
custs.add("Cust3");
custs.add("Cust2");
custs.add("Cust4");
}
}
我想注入 CDI Bean 的 ManagedBean 如下:
@SessionScoped
@ManagedBean
public class Hello implements Serializable {
@Inject
private BaseBean dBean;
private static final long serialVersionUID = 1L;
private List<String> customers;
private List<String> customersSelect;
public Hello() {
}
@PostConstruct
void init() {
// dBean = new BaseBean();
customers = dBean.getCusts();
}
public List<String> getCustomers() {
return customers;
}
public List<String> getCustomersSelect() {
return customersSelect;
}
public void setCustomersSelect(List<String> customersSelect) {
this.customersSelect = customersSelect;
}
}
然而,在init函数中,它抛出了空指针异常。如果我使用注释@Produces而不是@Inject,则结果相同:NullPointerException。CDI Bean有什么问题(注释不正确)?我是否以错误的方式尝试注入它?我的代码是否缺少某些内容?如何使其工作?以下是JSF代码:
<h:form id ="f">
<h:selectManyCheckbox layout="pageDirection" border="1" value="#{hello.customersSelect}">
<f:selectItems value="#{hello.customers}"></f:selectItems>
</h:selectManyCheckbox><br />
<h:commandButton action="response.xhtml" value="Click me" />
</h:form>
PS:如果我使用无状态Bean作为BaseBean,并用注释@EJB将其注入,它可以顺利运行。
更新:我已经尝试在Hello类上使用@SessionScoped
(javax.enterprise.context.SessionScoped
)和@Named
注释。虽然我没有收到NullPointerException
,但是h:selectManyCheckbox
为空。此外,当我在META-INF
文件夹下添加beans.xml
文件时,我遇到了StartException
,尽管该文件应该存在。我认为我的应用缺少适当的配置来实现依赖注入。可能需要额外的配置是什么?
更新2:当我在WEB-INF文件夹中添加beans.xml文件时,出现此错误。 beans.xml文件为空,只包含以下行:
<?xml version="1.0" encoding="UTF-8"?>
错误信息如下:
Services which failed to start: service jboss.deployment.unit."JSF1.war".PARSE: org.jboss.msc.service.StartException in service jboss.deployment.unit."JSF1.war".PARSE: Failed to process phase PARSE of deployment "JSF1.war"
12:51:11,482 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"JSF1.war\".PARSE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"JSF1.war\".PARSE: Failed to process phase PARSE of deployment \"JSF1.war\""}}}}
@Named
添加到任何您想从EL(表达式语言)访问的CDI bean中,即您的页面。因此,请删除@ManagedBean
并将Hello
替换为@Named
。至于异常,请发布堆栈跟踪,否则无法知道问题出在哪里。 - rdcrng