我认为建议使用CDI bean作为支持bean,而不是JSF托管bean。
所以我决定创建一个小例子,以了解它是如何工作的,为@RequestScopedBean:
使用<<p>,而strong> @ManagedBean (beanName) ,我使用 @ named (beanName)-而不是使用javax.faces.bean。javax.enterprise.context. requestscope;
演示程序是非常简单的,我有一个字段和一个提交按钮,当用户输入一些东西,页面被刷新,输入的值不再显示(它持续而请求持续?)。我想我做的一切都很好,但我得到一个异常,说:
警告:StandardWrapperValve[面孔[Servlet]: PWC1406: Servlet.service()for servlet Faces servlet抛出异常javax.el.PropertyNotFoundException:/index.xhtml @19, 47岁value = " # {cdiBean。passedValue}":目标不可达,标识符'cdiBean'解析为null
我的程序是这样的:
index.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>RequestScope demo CDI(Component Dependency Injection)</title>
</h:head>
<h:body>
<h:form>
<h3>RequestScope demo CDI(Component Dependency Injection)</h3>
<h:inputText value="#{cdiBean.passedValue}"/>
<br/>
<h:commandButton value="submit" action="index"/>
</h:form>
</h:body>
</html>
DemoBB.java
package backingbeans;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named("cdiBean")//The Named anotation indicates that this is a CDI bean
@RequestScoped//If we use CDI beans the @RequestScoped annotation must come from: javax.enterprise.context.RequestScoped;
public class DemoBB {
//This value will be saved on the session only until the server responds to the request
private String passedValue;
public String getPassedValue() {
return passedValue;
}
public void setPassedValue(String passedValue) {
this.passedValue = passedValue;
}
}
-我错在哪里?
-使用这种方法的优势是什么?我还是不明白。
您的web.xml
中是否有空的beans.xml
?我认为必须去那里。
阅读15.6节。引用原文:
CDI没有定义任何特殊部署归档文件。你可以打包jar、ejb - jar或war - any中的bean应用程序中的部署位置类路径中。然而,档案必须做一个"bean档案"。这意味着每个存档必须包含bean包含一个名为beans.xml的文件类路径或的META-INF目录web根目录下的web - inf目录(for战争档案)。该文件可能为空。部署在归档中的bean不需要有一个beans.xml文件会不会可用于应用程序。
在可嵌入的EJB容器中,bean可以部署在任何地方可以部署哪些ejb。再一次。每个位置必须包含一个beans.xml文件文件。