无法使用 RequestScoped bean 填充 Select 元素? [复制]

Posted

技术标签:

【中文标题】无法使用 RequestScoped bean 填充 Select 元素? [复制]【英文标题】:Failing to populate Select element using RequestScoped bean? [duplicate] 【发布时间】:2018-06-30 10:24:03 【问题描述】:

我一直在为一项看似非常简单的任务而苦苦挣扎,但不知何故,如果不使用一些非常老套的代码,我就无法找到解决它的方法——我真的想避免这种情况。

问题本身已简化为一项非常简单的任务:我有一个项目,其中包含一个包含表单的单页,我必须在其中键入非空用户名并使用选择元素 (h:selectOneMenu) 来选择一个此用户的“用户组”。这将提交给我拥有的 RequestScoped bean(这也是我在项目中拥有的唯一 bean)。唯一的验证规则(为了简化我的解释)是:“用户名”字段不能为空。

这是我页面的代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://xmlns.jcp.org/jsf/passthrough">

<h:head></h:head>
<h:body>
    <f:metadata>
        <f:event listener="#userManagementBean.initializeGroupsList()" type="preRenderView" />
    </f:metadata>


    <h:form>
        <h:inputText id="fieldUsername" value="#userManagementBean.user.username" p:placeholder="Username" required="true" />
        <h:message for="fieldUsername"/>

        <h:selectOneMenu id="fieldGroup" value="#userManagementBean.usergroup_id">
            <f:selectItem itemValue="#null" itemLabel="Please, select a group" />
            <f:selectItems value="#userManagementBean.groupsList" var="curGroup" itemLabel="#curGroup.groupName" itemValue="#curGroup.id" />
        </h:selectOneMenu>
        <h:message for="fieldGroup"/>

        <h:commandButton action="#userManagementBean.submitValues()" value="Submit data" />
    </h:form>
</h:body>
</html>

这是 bean 的代码,它初始化了一个包含选择框元素的列表:

import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

....

@RequestScoped
@Named
public class UserManagementBean implements Serializable 
    // PRIVATE FIELDS
    private User user = new User();
    private List<UserGroup> groupsList;
    private Integer usergroup_id;

    // BEAN'S PUBLIC METHODS
    public void initializeGroupsList() 
        groupsList = loadAllGroupsFromDatabase();
        System.out.print(String.format("%d groups have been loaded\n", groupsList.size()));
    

    // Getters, setters and database-loading code has been ommited
    ...

问题是:我应该何时/如何初始化用于填充页面上的选择元素的用户组列表?

首先,我尝试使用一个 元素,它在“preRenderView”事件上调用 initializeGroupsList()(就像我上面写的代码一样)。一切都很好,但是如果我选择一个用户组并且不输入任何用户名,则选择元素会在提交表单后返回错误消息(“验证错误:值无效”),虽然它不应该给我任何验证错误,因为用户选择了一个有效的用户组。

其次,我尝试将 替换为调用 initializeGroupsList()。当我第一次打开页面时,一切正常。但是当我在没有用户名的情况下提交表单时,页面会重新加载,显示验证错误,并且 select 元素根本没有填充任何用户组(未调用 initializeGroupsList()在这种情况下存在验证错误时根本不存在)。

目前我正在通过删除 元素以及注释 initializeGroupsList() 与 @PostConstruct。问题是:如果这样做,我将无法通过在 initializeGroupsList() 中使用 访问任何 URL 的查询字符串参数>,这是我希望在不久的将来能够在这个页面上做的事情。

那么我应该如何调用 initializeGroupsList(),以避免在第一种和第二种情况中描述的这些错误,同时允许我访问 initializeGroupsList() 中的 URL 查询字符串参数强>?

提前致谢。

【问题讨论】:

【参考方案1】:

继续使用@PostConstruct 来初始化initializeGroupsList()。

关于视图参数,您可以使用来自 ominifaces 的 @Param (http://showcase.omnifaces.org/cdi/Param),它会为您注入它们,而无需使用视图操作或视图事件。

【讨论】:

以上是关于无法使用 RequestScoped bean 填充 Select 元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 WildFly 上重新部署后,CDI 无法在 @Requestscoped REST 服务中将 @Singleton 设置为 @Provider

使用RequestScoped(面孔)和RequestScoped(上下文)有啥区别[重复]

如何选择合适的bean范围?

Validator JSF 中的 EJB bean

hello1 hello2 代码分析

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