【发布时间】: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