jsf primefaces postback jsf-2.2 view-scope

@ViewScoped bean recreado en cada solicitud de devolución de datos cuando se utiliza JSF 2.2



primefaces postback (1)

Esta,

import javax.faces.view.ViewScoped;

es la anotación específica de CDI introducida por JSF 2.2 , destinada a ser utilizada en combinación con la anotación de gestión de @Named específica de CDI @Named .

Sin embargo, está utilizando la anotación de administración de @ManagedBean específica de JSF @ManagedBean .

import javax.faces.bean.ManagedBean;

Entonces debería usar cualquiera de los ámbitos provistos por el mismo paquete javax.faces.bean lugar. El @ViewScoped correcto está por allí:

import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped public class MenusBean implements Serializable{

Si usa la combinación incorrecta, el bean se comporta como un bean @RequestScoped y se recreará en cada llamada.

Alternativamente, si su entorno admite CDI (GlassFish / JBoss / TomEE con Weld, OpenWebBeans, etc.), también puede reemplazar @ManagedBean por @Named :

import javax.inject.Named; import javax.faces.view.ViewScoped; @Named @ViewScoped public class MenusBean implements Serializable{

Se recomienda pasar a CDI. Las anotaciones de administración de frijol específicas de JSF son candidatas para obsolescencia en futuras versiones de JSF / Java EE ya que todo se mueve / unifica lentamente hacia CDI.

Tengo un problema similar a este post y la respuesta de @BalusC con 3 soluciones pero:

  • No estoy usando las expresiones EL mencionadas
  • No quiero ir con la segunda solución (es lo suficientemente complejo para mí así)
  • y el ahorro de estado parcial se establece en falso.

Mi código es el siguiente:

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.java :

package menus; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.view.ViewScoped; @ManagedBean @ViewScoped public class MenusBean implements Serializable{ private static final long serialVersionUID = -7793281454064343472L; private String mainPage="sub1_menu1"; private Map<String, Boolean> active; public MenusBean(){ System.out.println("MenusBean created"); active = new HashMap<>(); active.put(mainPage, true); active.put("sub1_menu2", false); } public boolean activateMenu(String page){ active.put(mainPage, false); active.put(page, true); mainPage = page; for (Map.Entry<String, Boolean> e : active.entrySet()) System.out.println(e.getKey()+":"+e.getValue()); return true; } public Map<String, Boolean> getActive() { return active; } }

Cuando se ejecuta, obtengo:

MenusBean created MenusBean created MenusBean created

¿Cómo es esto causado y cómo puedo resolverlo?