使用 CDI(上下文和依赖注入)支持 bean 而不是托管 Bean
Posted
技术标签:
【中文标题】使用 CDI(上下文和依赖注入)支持 bean 而不是托管 Bean【英文标题】:Using CDI (Context & Dependency Injection) backing beans instead of Managed Beans 【发布时间】:2011-09-28 17:22:38 【问题描述】:我认为建议使用 CDI bean 作为支持 bean 而不是 JSF 托管 bean。
所以我决定为 @RequestScopedBean 创建一个小示例,以了解其工作原理:
-我不使用 @ManagedBean("beanName") ,而是使用 @Named("beanName")
-而不是使用 javax.faces.bean.RequestScopped 我使用 javax.enterprise.context.RequestScoped;
演示程序非常简单,我有一个字段和一个提交按钮,当用户输入内容并刷新页面时,输入的值不再显示(它会在请求持续时持续,对吗?)。我认为我做的一切都很好,但我得到一个例外:
警告:StandardWrapperValve[Faces Servlet]:PWC1406:Servlet.service() 为 servlet Faces Servlet 抛出 例外 javax.el.PropertyNotFoundException: /index.xhtml @19,47 value="#cdiBean.passedValue": 目标 无法访问,标识符“cdiBean” 解决为空
这就是我的程序的样子:
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;
-我的错误在哪里?
-使用这种方法有什么好处?我还是不明白。
【问题讨论】:
【参考方案1】:您的web.xml
和beans.xml
有空吗?我认为必须在那里。
阅读第 15.6 节 here。引用自它:
CDI 没有定义任何特殊的 部署存档。你可以打包 JAR、EJB-JAR 或 WAR 中的 bean——任何 应用程序中的部署位置 类路径。但是,存档必须 成为“豆档案”。这意味着每个 包含 bean 的存档必须 在 类路径的 META-INF 目录或 Web 根目录的 WEB-INF 目录(对于 战争档案)。该文件可能为空。 部署在档案中的 Bean 有beans.xml文件不会 可在应用程序中使用。
在可嵌入的 EJB 容器中,bean 可以部署在任何位置 可以部署哪些 EJB。再次, 每个位置必须包含 beans.xml 文件。
【讨论】:
是的,我需要添加 beans.xml 你是对的 (+1) 我看到应用程序工作正常,但不像我想象的那样,我不明白为什么字段中的值不t 重定向后消失。 无论如何,感谢您的回答。很抱歉之前投了反对票。 @sfrj - 很高兴帮助你,没问题:)以上是关于使用 CDI(上下文和依赖注入)支持 bean 而不是托管 Bean的主要内容,如果未能解决你的问题,请参考以下文章