Tengo un problema similar a este post y la respuesta de @BalusC con 3 soluciones pero:
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.