为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2019-11-20 12:31:54
我在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@SessionScopedpublic class LabelDetailJSF implements Serializable{@ManagedProperty("#{genreLabelListJSF}")private GenreLabelListJSF genreLabelListJSF;private List<Genre> DetailLabelGenreList;private Label DetailLabel;/** Creates a new instance of LabelDetailJSF */public LabelDetailJSF() {}@PostConstructpublic 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语句的输出,并在最初加载页面时发现了以下内容。
查看完整描述

2 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

您使用了错误的@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表达式中创建一个新实例。


查看完整回答
反对 回复 2019-11-20
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-11-20
  • 2 回答
  • 0 关注
  • 770 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信