@在JSF页面中找不到命名bean
我正在使用Netbeans 8.0.2。我使用File->newproject->javaweb:web应用程序创建了一个非常简单的web应用程序 我试图在index.xhtml页面中打印@namedbean的实例变量,但它没有按预期工作。我使用Netbeans中的绿色“RunProject”按钮部署应用程序,该按钮自动打包、部署和启动浏览器 Web.xml@在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
<?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