validaciones showdemo sesiones framework example etiquetas ejemplo jsf primefaces postconstruct

showdemo - sesiones en jsf



@SessionScoped bean pierde alcance y se recrea todo el tiempo, los campos se vuelven nulos (1)

Está utilizando la anotación @SessionScoped equivocada. Está utilizando el de CDI, mientras que ha registrado el bean con la anotación JSF @ManagedBean lugar de la anotación CDI @Named .

Reemplazar la importación CDI @SessionScoped

import javax.enterprise.context.SessionScoped;

por la importación JSF @SessionScoped

import javax.faces.bean.SessionScoped;

Ver también:

Tengo un problema muy extraño con un bean SessionScoped en un proyecto JSF 2.0. Utilizando Netbeans 6.9.1, el servidor Glassfish 3 y PrimeFaces 3 como la biblioteca de componentes JSF.

Aquí hay un código:

package com.hia.jsf; import com.hia.netlabel.jpa.Genre; import com.hia.netlabel.jpa.Label; import java.io.Serializable; import java.util.List; import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; @ManagedBean @SessionScoped public class LabelDetailJSF implements Serializable{ @ManagedProperty("#{genreLabelListJSF}") private GenreLabelListJSF genreLabelListJSF; private List<Genre> DetailLabelGenreList; private Label DetailLabel; /** Creates a new instance of LabelDetailJSF */ public LabelDetailJSF() { } @PostConstruct public void init(){ System.out.print("Running init LabelDetailJSF"); if(genreLabelListJSF.getSelectedLabel()!=null) { System.out.print("genreLabelListJSF was not null"); this.DetailLabelGenreList=genreLabelListJSF.getSelectedLabel().getGenreList(); this.DetailLabel= (genreLabelListJSF.getSelectedLabel()); } if(this.DetailLabelGenreList==null){ System.out.println("Bloody thing became null"); } } /** * @return the DetailLabel */ public Label getDetailLabel() { return DetailLabel; } /** * @param DetailLabel the DetailLabel to set */ public void setDetailLabel(Label DetailLabel) { System.out.println("Setting Detail Label For LabelDetailJSF to:"+DetailLabel.getLabelName()); this.DetailLabel = DetailLabel; } /** * @return the DetailLabelGenreList */ public List<Genre> getDetailLabelGenreList() { System.out.println("There is:"+this.DetailLabelGenreList.size()+ " Genres available"); return DetailLabelGenreList; } /** * @param DetailLabelGenreList the DetailLabelGenreList to set */ public void setDetailLabelGenreList(List<Genre> DetailLabelGenreList) { System.out.println("Setting the DetailLabelGenre List to have "+DetailLabelGenreList.size()); this.DetailLabelGenreList = DetailLabelGenreList; } /** * @return the genreLabelListJSF */ public GenreLabelListJSF getGenreLabelListJSF() { return genreLabelListJSF; } /** * @param genreLabelListJSF the genreLabelListJSF to set */ public void setGenreLabelListJSF(GenreLabelListJSF genreLabelListJSF) { this.genreLabelListJSF = genreLabelListJSF; } }

Así que, básicamente, he inyectado otro beans de sesiones comprimido llamado GenreLabelListJSF en LabelDetailJSF. Quiero mostrar DetailLabelGenreList dentro de una tabla de datos. Aquí está el fragmento de XHTML usado para mostrar la tabla de datos

<p:dataTable id="detailLabelGenreGrid" value="# {labelDetailJSF.detailLabelGenreList}" var="genre" paginator="true" styleClass="text70" rows="2" > <p:column style="min-width:196px;"> #{genre.genreName} </p:column> </p:dataTable>

Cuando se carga la página, inicialmente obtengo la tabla con algunas filas. Cuando hago clic en los botones de búsqueda, es donde comienza la diversión.

Revisé el resultado de todas las declaraciones de System.out y encontré lo siguiente cuando la página se carga inicialmente.

INFO: Running init LabelDetailJSF INFO: genreLabelListJSF was not null INFO: There is:29 Genres available INFO: There is:29 Genres available INFO: There is:29 Genres available INFO: There is:29 Genres available INFO: There is:29 Genres available INFO: There is:29 Genres available

Cuando hago clic en los botones de página de la tabla de datos obtengo lo siguiente:

INFO: Running init LabelDetailJSF INFO: Bloody thing became null SEVERE: javax.el.ELException: /LabelDetail.xhtml @62,165 value="# {labelDetailJSF.detailLabelGenreList}": java.lang.NullPointerException at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:107) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190) at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178) at javax.faces.component.UIData.getValue(UIData.java:554) at org.primefaces.component.datatable.DataTable.getValue(DataTable.java:731) at javax.faces.component.UIData.getDataModel(UIData.java:1248) at javax.faces.component.UIData.setRowIndex(UIData.java:447) at javax.faces.component.UIData.visitTree(UIData.java:1184) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457) at javax.faces.component.UIForm.visitTree(UIForm.java:333) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457) at javax.faces.component.UIComponent.visitTree(UIComponent.java:1457) at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:223) at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:177) at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:131) at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:430) at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:143) at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:199) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.comet.CometEngine.executeServlet(CometEngine.java:473) at com.sun.grizzly.comet.CometEngine.handle(CometEngine.java:341) at com.sun.grizzly.comet.CometAsyncFilter.doFilter(CometAsyncFilter.java:84) at com.sun.grizzly.arp.DefaultAsyncExecutor.invokeFilters(DefaultAsyncExecutor.java:161) at com.sun.grizzly.arp.DefaultAsyncExecutor.interrupt(DefaultAsyncExecutor.java:137) at com.sun.grizzly.arp.AsyncProcessorTask.doTask(AsyncProcessorTask.java:88) at com.sun.grizzly.http.TaskBase.run(TaskBase.java:189) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.NullPointerException at com.hia.jsf.LabelDetailJSF.getDetailLabelGenreList(LabelDetailJSF.java:72) at sun.reflect.GeneratedMethodAccessor951.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:302) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:175) at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) at com.sun.el.parser.AstValue.getValue(AstValue.java:116) at com.sun.el.parser.AstValue.getValue(AstValue.java:163) at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:219) at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:102) ... 48 more

Por lo que puedo ver, es casi como si el bean perdiera alcance y fuera recreado todo el tiempo. Inicialmente, los valores están ahí, cuando comienza la búsqueda, el bean pierde valor. Por ejemplo, noté que el bean @ManagedProperty también se vuelve nulo cuando se inicia el paginado. Lo cual es un poco loco ya que también es un bean con ámbito de sesión.

Sigue siendo una nueva mano en JSF, así que probablemente cometí algún error novato. Debo mencionar que inicialmente creé esto como un frijol ViewScoped por accidente, y después de cambiar el bean a SessionScoped no desplegué la aplicación reinicié Glassfish y la compilé y volví a implementar.

¿Algunas ideas?