在 JSF 页面中找不到 @Named bean
@Named bean not found in JSF page
我正在使用 Netbeans 8.0.2。我使用 File -> New Project -> Java Web : Web Application 创建了一个非常简单的(打算成为 JSF 的)Web 应用程序。
我试图在我的 index.xhtml 页面中打印 @Named bean 的实例变量,但它没有按预期工作。我正在使用 Netbeans 中的绿色 "Run Project" 按钮部署应用程序,它会自动打包、部署和启动浏览器。
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>MyContext</param-name>
<param-value>null</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
index.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelets Hello Greeting</title>
</h:head>
<h:body>
<!-- I am expecting the beans name to be printed here... -->
The managed bean name is: #{myFirstBean.name}
</h:body>
</html>
托管 Bean
package my.first.jfs;
import java.io.Serializable;
import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class MyFirstBean implements Serializable {
public String name = "Insert your Name here...";
public MyFirstBean() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
下面是启动应用程序后我的浏览器的屏幕截图。
如果需要任何其他信息,请告诉我。谢谢!
如果您只想使用 JSF 框架,则应将 @Named 注释替换为 @ManagedBean。我认为这将解决您在这种情况下的问题。
有关详细信息,请阅读此主题: Difference between @Named and @ManagedBean annotations in JSF2.0 Tomcat7
和这个 "sub-one": ManagedProperty in CDI @Named bean returns null
您正在 class 上混合使用基于 CDI 和 JSF 的注释。如果您正在使用 Java EE7 和符合 EE7 的容器,您可能会 运行 进入 EE7 默认 "bean-discovery-mode=annotated" 的更大问题。默认情况下,CDI bean 在使用显式范围(@RequestScoped
、@SessionScoped
等)注释时进行管理。
但是,当像这样混合 CDI/JSF 时,您的 bean 实际上是 @DependentScoped 并且因为 EE7 默认发现模式没有选择作用域,因为它不是显式的,所以您的 bean 不是没有像预期的那样直接管理。
这可以通过在 beans.xml 文件中设置 bean-discovery-mode 或通过确保在 bean 上明确定义 CDI 范围来更改。除非您特别需要使用 JSF 托管 bean 范围,否则您应该换出
import javax.faces.beans.SessionScoped
和
import javax.enterprise.context.SessionScoped
JSF 的注释已移植到 CDI,因此通常您应该能够坚持使用普通 CDI。
我还建议您将 name
字段设置为 private
,因为您已经提供了 getter/setter。
希望这对您有所帮助。此外,这里有几个关于 CDI 激活和范围界定的链接,它们可能会有所帮助。