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

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 :

     Insert title here    

...

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 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 e : active.entrySet()) System.out.println(e.getKey()+":"+e.getValue()); return true; } public Map getActive() { return active; } } 

Cuando se ejecuta, obtengo:

 MenusBean creado
 MenusBean creado
 MenusBean creado

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

    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.