@SessionScoped bean失去作用域并一直被重新创建,字段变为空

我在JSF 2.0项目中使用SessionScoped bean有一个非常奇怪的问题。使用Netbeans 6.9.1,Glassfish 3服务器和PrimeFaces 3作为JSF组件库。


这是一些代码:


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;

}


因此,基本上,我已经将另一个称为GenreLabelListJSF的会话范围的bean注入LabelDetailJSF中。我想在dataTable中显示DetailLabelGenreList。这是用于显示数据表的XHTML代码段


<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>

当页面加载时,我最初获得的表中包含一些行。当我单击分页按钮时,这就是乐趣的开始。


我检查了所有System.out语句的输出,并在最初加载页面时发现了以下内容。

慕丝7291255
浏览 771回答 2
2回答

qq_遁去的一_1

您使用了错误的@SessionScoped注释。如果您已使用JSF @ManagedBean批注注册了bean ,则需要@SessionScoped从JSF(javax.faces)包中导入,如下所示:import javax.faces.bean.SessionScoped;当您在JSF托管Bean上错误地使用CDI范围时,则JSF托管Bean实际上没有JSF范围,它会退回到其默认值@RequestScoped,即在每个HTTP请求中创建一个新实例。如果您已使用CDI @Named批注注册了bean ,则需要@SessionScoped从CDI(javax.enterprise.context)包中导入,如下所示:import javax.enterprise.context.SessionScoped;当您在CDI托管Bean上错误地使用JSF范围时,那么CDI托管Bean实际上就没有CDI范围,它会退回到其默认@Dependent范围,从而在每个EL表达式中创建一个新实例。

天涯尽头无女友

是的,我不时睡觉。CDI是基于注释的依赖项注入框架,可以与除JSF之外的任何其他框架结合使用。就像早在J2EE时代的春天一样。但是,并不总是建议在一个项目中混合使用JSF和CDI批注。使用JSF或CDI。因此,请使用JSF&nbsp;@ManagedBean @SessionScoped或CDI&nbsp;@Names @SessionScoped。CDI具有imo,但是在JSF Web应用程序中有一个主要缺点,它没有提供JSF“视图范围”的注释(可通过获得)@ViewScoped。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript