@在JSF页面中找不到命名bean

@在JSF页面中找不到命名bean,jsf,cdi,managed-bean,Jsf,Cdi,Managed Bean,我正在使用Netbeans 8.0.2。我使用File->newproject->javaweb:web应用程序创建了一个非常简单的web应用程序 我试图在index.xhtml页面中打印@namedbean的实例变量,但它没有按预期工作。我使用Netbeans中的绿色“RunProject”按钮部署应用程序,该按钮自动打包、部署和启动浏览器 Web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1

我正在使用Netbeans 8.0.2。我使用File->newproject->javaweb:web应用程序创建了一个非常简单的web应用程序

我试图在index.xhtml页面中打印@namedbean的实例变量,但它没有按预期工作。我使用Netbeans中的绿色“RunProject”按钮部署应用程序,该按钮自动打包、部署和启动浏览器

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>
下面是启动应用程序后我的浏览器的屏幕截图


如果需要其他信息,请告诉我。谢谢

如果您只想使用JSF框架,那么应该将@Named注释替换为@ManagedBean。我想在这种情况下它会解决你的问题

有关详细信息,请阅读本主题:

而这个“子一”:

您在类中混合了基于CDI和JSF的注释。如果您正在使用JavaEE7和兼容EE7的容器,那么您可能会遇到更大的问题,即EE7的默认“bean discovery mode=annotated”。默认情况下,当使用显式作用域(
@RequestScoped
@SessionScoped
等)进行注释时,CDIBean将被管理

然而,当像这样混合CDI/JSF时,您的bean实际上是不明确的,并且因为EE7默认发现模式没有选择范围,因为它不是显式的,所以您的bean没有按照预期进行直接管理

这可以通过在beans.xml文件中设置bean发现模式或确保在bean上显式定义了CDI作用域来改变。除非您有使用JSF托管bean作用域的特殊需要,否则您应该将其替换掉

import javax.faces.beans.SessionScoped

JSF的注释已经移植到CDI,所以一般来说,您应该能够坚持使用普通CDI

我建议您也将您的
名称
字段
设置为私有
,因为您已经提供了getter/setter

希望这有帮助。此外,这里还有一些关于CDI激活和范围界定的链接,这些链接可能是有益的


javax.faces.bean.SessionScoped
?托管bean使用默认的
@依赖的
伪作用域。除非它来自
javax.enterprise.context,否则它不是您可能认为的会话范围bean。SessionScoped
@Named
被替换为
@ManagedBean
。此问题仅处理表单提交中涉及此类bean时的问题,不是在一个纯粹的演示中:这是可以接受的dupe吗?在阅读了那边的答案后,您可能会看到,根据您目前提供的信息,无法查明确切的原因。您的问题中完全没有关于CDI和服务器品牌/版本的配置详细信息。这只会导致提交表单时bean作用域错误,而不是仅仅在打印其属性时找不到bean。不确定为什么有人对此帖子给予否定,它解决了我的问题!我的答案是正确的,这取决于您想要使用什么:JSF或JSF/CDI。BalusC对使用CDI和JSF时的行为进行了分析,whitlaaa给出了使用两者的方法。如果您想要一个JSF/CDI实现的完整示例,请看:@BalusC Correct,这只是解决了由于混合CDI/JSF而导致的不正确的作用域,但更重要的是由隐式bean发现模式(假设使用了EE7)导致的。我将更新我的答案,希望能澄清这一点。很抱歉,很长时间没有回到这个问题上。我从未听说过CDI,谢谢你提供的信息,我一定会读到的。我的项目对javax.enterprise.context没有任何依赖关系,因此我无法根据您的建议更改导入。
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;
    }

}
import javax.faces.beans.SessionScoped
import javax.enterprise.context.SessionScoped