使用 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.xmlbeans.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的主要内容,如果未能解决你的问题,请参考以下文章

构建过程中发生错误。在项目上运行构建器“CDI(上下文和依赖注入)构建器”时出错

CDI feature

Servlet CDI example analysis

Servlet CDI Example Analysis

CDI:由于多重继承和泛型抽象导致的属性注入问题

为啥在 CDI 中使用构造函数而不是 setter 注入?