@ViewScoped JSF bean 被多次初始化

Posted

技术标签:

【中文标题】@ViewScoped JSF bean 被多次初始化【英文标题】:@ViewScoped JSF bean getting initialized multiple times 【发布时间】:2014-06-21 02:48:19 【问题描述】:

我正在使用 primefaces 4.0Mojarra 2.2.6

我正在从会话范围的 bean 打开一个对话框(模态) - 在对话中我初始化了一个 @ViewScoped bean,它从会话映射等中检索少量名称(字符串)列表。

问题是每次我通过单击保存按钮提交时,都会创建新的viewScoped bean,这显然不是我想要的行为。我看到许多其他关于同一主题的问题得到了解答,并且还尝试将 web.xml 设置为:

<context-param> <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name> <param-value>false</param-value> </context-param>

但它仍然不起作用。我还消除了几乎所有标签,除了输入字段和提交按钮,以消除任何可能导致它的特定标签处理程序,但似乎仍然无法确定它为什么不起作用。这是我的示例xhtml 页面和viewScope bean 保存方法:

会话 bean 代码

            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("NAMES", names);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("modal", true);
        map.put("draggable", false);
        map.put("resizable", false);
        map.put("dynamic", true);
        map.put("contentHeight", 500);
        RequestContext.getCurrentInstance().openDialog("SaveNames.xhtml", map, null );

XHTML <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:o="http://omnifaces.org/ui" xmlns:of="http://omnifaces.org/functions"> <h:form id="myform" <p:inputText id="newFolderName" disabled="#not mybean.list" value="#mybean.newName" autocomplete="off"></p:inputText> <p:commandButton id="saveNewNameButton" type="push" value="Save" action="#mybean.saveNewName" icon="ui-icon-disk" oncomplete="exit()" style="float: right"> </p:commandButton> </h:form> 查看范围 bean

public void saveNewName()
 //saving logic goes here

【问题讨论】:

【参考方案1】:

好的,经过一整天的故障排除后,我发现了这个非常愚蠢的原因。发布答案以防其他人最终遇到同样的问题。

我使用了错误的@ViewScoped 包注释。显然有两个注解,javax.faces.view.ViewScopedjavax.bean.ViewScoped -

正确使用的是javax.bean.ViewScoped - 但是,如果您在 STS/eclipse 中没有注意它会在自动完成中建议包时,您最终可能会选择错误的包,这可能会导致此问题。

【讨论】:

javax.faces.view.ViewScoped 用于 CDI backing beans

以上是关于@ViewScoped JSF bean 被多次初始化的主要内容,如果未能解决你的问题,请参考以下文章

在 JSF 中如何以及何时销毁 @ViewScoped bean?

JSF 2.x @ViewScoped 托管 bean 线程安全吗?

JSF ViewScoped bean 在所有 ajax 请求中的唯一 ID?

即使在刷新页面后,Firefox 也会在 JSF-Viewscoped-Managed-Bean 中保留数组的内容

无法将 JSF ViewScoped bean 作为 ManagedProperty 注入 Validator

JSF 2.2 内存消耗:为啥 Mojarra 将最后 25 个视图的 ViewScoped Beans 保留在内存中?