@在使用JSF2.2时,在每个回发请求上重新创建ViewScope bean

@在使用JSF2.2时,在每个回发请求上重新创建ViewScope bean,jsf,primefaces,postback,jsf-2.2,view-scope,Jsf,Primefaces,Postback,Jsf 2.2,View Scope,我遇到了一个类似于@BalusC的问题和答案,有3种解决方案,但: 我没有使用提到的EL表达式 我不想使用第二种解决方案(它对我来说已经够复杂了) 部分状态保存设置为false 我的代码如下: index.xhtml: <?xml version="1.0" encoding="windows-1256" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht

我遇到了一个类似于@BalusC的问题和答案,有3种解决方案,但:

  • 我没有使用提到的EL表达式
  • 我不想使用第二种解决方案(它对我来说已经够复杂了)
  • 部分状态保存设置为false
我的代码如下:

index.xhtml

<?xml version="1.0" encoding="windows-1256" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Insert title here</title>
    </h:head>
    <h:body>
        <h:form>
            <p:panelMenu id="westMenu">
                <p:submenu id="sub1" label="System Monitor">
                    <p:menuitem id="menu1" value="live monitoring" 
                            action="#{menusBean.activateMenu('sub1_menu1')}" 
                            update=":centerPane,westMenu" 
                            disabled="#{menusBean.active['sub1_menu1']}" />
                    <p:menuitem id="menu2" value="reports" 
                            action="#{menusBean.activateMenu('sub1_menu2')}"
                            update=":centerPane,westMenu" 
                            disabled="#{menusBean.active['sub1_menu2']}" />
                </p:submenu>
                <p:submenu id="sub2" label="Charging System Nodes" />
                <p:submenu id="sub3" label="Additional Nodes" />
            </p:panelMenu>
        </h:form>
        <h:panelGroup id="centerPane">
            ...
        </h:panelGroup>
    </h:body>
</html>
执行时,我得到:

MenusBean created MenusBean created MenusBean created MenusBean已创建 MenusBean已创建 MenusBean已创建 这是怎么造成的,我该如何解决它呢?

这个

import javax.faces.view.ViewScoped;
是注释,打算与特定于CDI的bean管理注释结合使用
@Named

但是,您使用的是特定于JSF的bean管理注释
@ManagedBean

import javax.faces.bean.ManagedBean;
然后,您应该使用由同一程序提供的任何作用域。右边在那边:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class MenusBean implements Serializable{
如果您使用了错误的组合,那么bean的行为就像一个
@RequestScoped
bean,并在每次调用时重新创建

或者,如果您的环境支持CDI(GlassFish/JBoss/TomEE with Weld、OpenWebBeans等),那么您也可以将
@ManagedBean
替换为
@Named

import javax.inject.Named;
import javax.faces.view.ViewScoped;

@Named
@ViewScoped
public class MenusBean implements Serializable{

建议转到CDI。JSF特定的bean管理注释在未来的JSF/Java EE版本中可能会被弃用,因为一切都在慢慢地向CDI移动/统一。

ok,这解决了一些问题,但只是部分解决了:(,在更改注释并加载页面后,它工作得很好,但当我转到“报告”时)菜单它从一次又一次的创建开始,当我回到“实时监控”菜单时,它又创建了一个并停止了。有什么想法吗?好吧,这很尴尬。bean现在是由JSF还是CDI管理的?你尝试过另一个吗?你绝对肯定重建/重新部署成功了,浏览器缓存干净整洁吗?(Chrome中的Ctrl+Shift+N)我真的不知道CDI是什么,但我没有javax.inject包,所以我想它是由JSF管理的(对不起,这里是noob).是我的项目;我清除了FF中的缓存,并尝试使用eclipse内置浏览器,它们都给出了相同的结果。好的。鉴于您手头没有CDI,我可以假设您使用Tomcat作为服务器吗?抱歉,无法在Tomcat 7.0.47上用Mojarra 2.2.4复制它,以及问题中以当前形式发布的确切代码。您是fa吗miliar使用基本HTTP传递请求参数、cookie等?在Chrome中按F12键,然后单击网络选项卡查看它。它应该提供有关问题的线索(例如缺少会话cookie)。
import javax.inject.Named;
import javax.faces.view.ViewScoped;

@Named
@ViewScoped
public class MenusBean implements Serializable{