【问题标题】:How to form @Named Backing Bean in JSF如何在 JSF 中形成 @Named 支持 Bean
【发布时间】:2014-03-10 12:31:16
【问题描述】:

我在某处读到最好使用 CDI @Named 而不是 JSF @ManagedBean,因为 CDI,所以我正在尝试转换我的一些代码。 我试图在 JSF 中使用@Named,但它总是无法访问。 使用@ManagedBean时没有问题。

我像@ManagedBean一样使用它,如下

CustomerBacking.java

package com.wordpress.marczykm.backing;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named("customer")
@RequestScoped
public class CustomerBacking {

    @EJB
    private CustomerService customerService;

    public CustomerBacking() {
    }

    public String addCustomer(Customer customer) {
        customerService.addCustomer(customer);
        return "customer_overview";
    }

    public Customer getCustomer(){
        return customerService.getCustomer();
    }
}

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>EJB 3.0 Test</title>
    </h:head>
    <h:body>
        <h:outputText value="#{customer.firstname}"/>
        <h:form>
            <h:outputText value="Imię"/>
            <h:inputText id="firstname" name="firstname" value="#{customer.firstname}" /><br/>

            <h:outputText value="Nazwisko"/>
            <h:inputText id="lastname" name="lastname" value="#{customer.lastname}" /><br/>

            <h:commandButton value="Dodaj" actionListener="#{customer.addCustomer}"/>
        </h:form>
</h:body>
</html>

【问题讨论】:

  • 您混合了 JSF 命名空间和 CDI 命名空间。请改用import javax.enterprise.context.RequestScoped。此外,您的支持 bean 代码和 xhtml 不匹配,但我认为这是复制和粘贴错误。
  • 好的,我已经编辑了代码(更改为正确的导入语句并将注释更改为@Named("customer")),但在单击命令按钮后,我仍然有 Target Unreachable,标识符“客户”已解决为空错误
  • 您是如何在您的环境中安装/启用 CDI 的?它在默认情况下被禁用,并且在某些服务器(例如 Tomcat)中甚至默认情况下都没有安装。
  • 我刚刚使用 Spring Tool Suite 创建了新的 Dynamic Web Project 并在项目 Properties/Project Facets 中勾选了 Java Server Faces
  • 呃,我没要求。我可以假设您不知道如何/何时为环境启用 CDI?从技术上讲,您的 Web 内容文件夹中根本没有 /WEB-INF/beans.xml 文件?

标签: jsf cdi managed-bean named


【解决方案1】:

您没有提及您使用的是哪个 servlet 容器/应用程序服务器以及哪个 CDI 实现版本。

我不知道 Spring Tool Suite 的默认设置是什么,大概是 Tomcat、Spring 而根本没有 CDI,因此您必须添加和配置 CDI 实现(例如 Weld 或 OpenWebBeans)。

对于 CDI 1.0,您必须添加一个 WEB-INF/beans.xml 描述符(可能为空)才能发现您的 bean。对于 CDI 1.1,这不再是必需的。

【讨论】:

    【解决方案2】:

    综上所述,查看 Netbeans 示例 CDI 应用程序,需要 JSF 页面可访问的 bean 需要:

    • 有@Named 注解(javax.inject.Named)
    • 具有范围注释(如@SessionScoped、@RequestScoped、@ViewScoped),但从 javax.enterprise.context.* 导入。*
    • 不必有空的、无参数的构造函数
    • 我的代码中没有的是,bean 需要实现 Serializable (java.io.Serializable)
    • 最后一件事是,如果您的应用程序是 Web 应用程序,则它需要 WEB-INF 目录中的 beans.xml(可以完全为空),如果是 bean 应用程序,则必须在 META-INF 目录中

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2012-06-27
      • 2012-11-15
      相关资源
      最近更新 更多