如何在JSF中构建@Named Backing Bean

时间:2014-02-12 09:23:49

标签: jsf cdi managed-bean named

我在某处读过,因为CDI,最好使用CDI @Named而不是JSF @ManagedBean,所以我试图转换我的一些代码。 我正在尝试在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>

2 个答案:

答案 0 :(得分:1)

总结一下,看看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目录中

答案 1 :(得分:0)

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

我不清楚Spring Tool Suite默认采用的是什么,可能是Tomcat,Spring而且根本没有CDI,所以你必须添加和配置CDI实现(例如Weld或OpenWebBeans)。

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