Jsf 如何在ManagedBean中注入CDIBean?
我想在ManagedBean中注入一个CDIBean,使用注释@inject或@product。我使用的CDIBean是:Jsf 如何在ManagedBean中注入CDIBean?,jsf,jakarta-ee,ejb,java-ee-6,cdi,Jsf,Jakarta Ee,Ejb,Java Ee 6,Cdi,我想在ManagedBean中注入一个CDIBean,使用注释@inject或@product。我使用的CDIBean是: @Named @Startup @ApplicationScoped public class BaseBean { private List<String> custs; public List<String> getCusts() { return custs; } public void setCusts(List<Stri
@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");
}
}
错误是:
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\""}}}}
如果您正在使用
@ManagedBean
使用@ManagedProperty
注入属性:
@ManagedProperty(value = "#{baseBean}")
private BaseBean dBean;
// getter and setter
通过在应用程序中放入
WEB-INF/beans.xml
文件,确保已启用CDI。如果在CDI bean上使用@Named
,则@patlov的建议将起作用。但是,如果您在支持CDI的环境中工作,请不要使用@ManagedBean
。相反,始终使用CDI。看到这一点,我相信你会发现很多其他人强烈反对你的做法
只要从javax.faces.bean.SessionScoped
切换到javax.enterprise.context.SessionScoped
,一切都会神奇地工作。但是,您可能会遇到CDI中缺少@ViewScoped
,在这种情况下,请使用JBoss Seam或Apache Deltaspike之类的工具为您实现它。另外一个好处是,如果您已经为JSF编写了现有代码,它们还将自动用CDI作用域替换所有JSF作用域
更新:
这应该是beans.xml的内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
当我将其添加到WEB-INF下时,它会在服务器的开始处抛出一个错误:org.jboss.msc.service.StartException。当我在META-INF下添加它时,它会启动服务器,但问题并没有消除。仍然是NullPointerException。StartException
是正确的方向。可能意味着现在启用了CDI,在CDI开始工作之前,您需要解决一些与CDI相关的问题。不知何故,我忽略了这一点。stacktrace也没有给出任何提示。@arjacsoh对不起,我想我应该提到,您应该将@Named
添加到您希望从EL(表达式语言)即您的页面访问的任何CDI bean中。因此,删除@ManagedBean
并将@Named
添加到Hello
。至于异常,请发布堆栈跟踪,否则就不知道出了什么问题。这就是我所做的。我用@Named替换了@ManagedBean,另外还有导入语句javax.enterprise.context.SessionScoped,如您所述。正如我在更新中所解释的那样,数据不会呈现到JSF页面。您也可以在更新中说,您得到了一个开始异常-您可以为此发布堆栈跟踪吗?好的,在调整beans.xml的内容之后,这次它可以工作了。我在书中读到,即使是一个空的beans.xml文件也足以完成这项工作,这让我受骗了。是的,这是误导,因为您仍然需要根元素。
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\""}}}}
@ManagedProperty(value = "#{baseBean}")
private BaseBean dBean;
// getter and setter
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>