使 Primefaces 的数据表行在行版本上无效

2024-04-29

我正在使用 JSF 2.1 + Primefaces 5.1 开发一个网络应用程序。我有一个带有行版本的数据表,每行有 2inputText, 2 selectOneMenu and 1 selectBooleanCheckbox。我想在单击复选图标时执行一些业务逻辑验证:它将验证 2 的值selectOneMenus。为此,我创建了一个与第二个关联的自定义验证器selectOneMenu验证这两个值:

<p:dataTable id="users_table_id" var="user" value="#{usersBean.users}" rowKey="#{user.id}" paginator="true"
            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
               rowsPerPageTemplate="5,10,15" emptyMessage="#{msgs.no_records}" sortBy="#{user.id}" sortOrder="ascending" rows="15" editable="true">
            <f:facet name="header">
                #{msgs.users}               
            </f:facet>
            <p:ajax event="rowEdit" listener="#{usersBean.onRowEdit}" update=":users_form_id:growl"/>
            <p:ajax event="rowEditInit" listener="#{usersBean.onRowEditInit}" update=":users_form_id:growl"/>
            <p:ajax event="rowEditCancel" listener="#{usersBean.onRowEditCancel}" update=":users_form_id:growl"/>
            <p:column headerText="#{msgs.id}" sortBy="#{user.id}" styleClass="centered-column">
                #{user.id}
            </p:column>          
            <p:column headerText="#{msgs.description}" sortBy="#{user.description}" styleClass="centered-column">
                <p:cellEditor>
                    <f:facet name="output">#{user.description}</f:facet>
                    <f:facet name="input"><p:inputText value="#{user.description}" styleClass="editable-cell"/></f:facet>
                </p:cellEditor>
            </p:column>          
            <p:column headerText="#{msgs.password}" sortBy="#{user.password}" styleClass="centered-column">
                <p:cellEditor>
                    <f:facet name="output">#{user.password}</f:facet>
                    <f:facet name="input"><p:inputText value="#{user.password}" styleClass="editable-cell"/></f:facet>
                </p:cellEditor>
            </p:column>
            <p:column headerText="#{msgs.sending_system}" sortBy="#{user.playerIn.description}" styleClass="centered-column">
                <p:cellEditor>
                    <f:facet name="output">#{user.playerIn.description}</f:facet>
                    <f:facet name="input">
                        <p:selectOneMenu binding="#{userPlayerInComponent}" styleClass="editable-cell" id="users_table_sending_system_id" value="#{user.playerIn}" effectSpeed="fast" filter="true" filterMatchMode="contains" converter="#{playerConverter}">
                            <f:selectItem itemLabel="#{msgs.select_option}" itemValue="#{null}" noSelectionOption="true"/>
                            <f:selectItems value="#{usersBean.players}" var="player" itemValue="#{player}" itemLabel="#{player.description}"/>
                        </p:selectOneMenu>
                    </f:facet>
                </p:cellEditor>
            </p:column> 
            <p:column headerText="#{msgs.receiving_system}" sortBy="#{user.playerOut.description}" styleClass="centered-column">
                <p:cellEditor>
                    <f:facet name="output">#{user.playerOut.description}</f:facet>
                    <f:facet name="input">
                        <p:selectOneMenu styleClass="editable-cell" id="users_table_receiving_system_id" value="#{user.playerOut}" effectSpeed="fast" filter="true" filterMatchMode="contains" converter="#{playerConverter}">
                            <f:selectItem itemLabel="#{msgs.select_option}" itemValue="#{null}" noSelectionOption="true"/>
                            <f:selectItems value="#{usersBean.players}" var="player" itemValue="#{player}" itemLabel="#{player.description}"/>

                            <f:validator validatorId="userValidator"/>
                            <f:attribute name="userPlayerInComponent" value="#{userPlayerInComponent}"/>
                        </p:selectOneMenu>
                    </f:facet>
                </p:cellEditor>
            </p:column>                                     
            <p:column headerText="#{msgs.active}" sortBy="#{user.active}" styleClass="centered-column">
                <p:cellEditor>
                    <f:facet name="output"><p:selectBooleanCheckbox value="#{user.active}" disabled="true"/></f:facet>              
                    <f:facet name="input"><p:selectBooleanCheckbox value="#{user.active}"/></f:facet>
                </p:cellEditor>
            </p:column>
            <p:column styleClass="datatable-row-editor">
                <p:rowEditor/>
            </p:column>
            <f:facet name="footer">
            </f:facet>      
        </p:dataTable>
@FacesValidator("userValidator")
public class UserValidator implements Validator {

    private static final Logger logger =  LogManager.getLogger(UserValidator.class);

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        logger.entry(context, component, value);

        if (value == null) {
            return; // Let required="true" handle.
        }

        UIInput userPlayerInComponent = (UIInput)component.getAttributes().get("userPlayerInComponent");
        if (!userPlayerInComponent.isValid()) {
            return; // Already invalidated. Don't care about it then.
        }

        DtoPlayer playerIn = (DtoPlayer)userPlayerInComponent.getValue();
        if (playerIn == null) {
            return; // Let required="true" handle.
        }

        DtoPlayer playerOut = (DtoPlayer)value;

        UsersBean usersBean = context.getApplication().evaluateExpressionGet(context, "#{usersBean}", UsersBean.class);

        BigDecimal userId = usersBean.getUserEditingId();
        logger.info(userId + " - " + playerIn.getDescription() + " - " + playerOut.getDescription());

        for (DtoUser dtoUser : usersBean.getUsers()) {
            if (!userId.equals(dtoUser.getId()) && dtoUser.getPlayerIn().equals(playerIn) && dtoUser.getPlayerOut().equals(playerOut)) {
                logger.info("Invalidating...");
                userPlayerInComponent.setValid(false);              
                FacesContext.getCurrentInstance().validationFailed();
                throw new ValidatorException(new FacesMessage("BOOM!"));
            }
        }
        logger.exit();
    }
}

我期待的是,当验证失败时(并且ValidatorException被抛出),数据表行将保持编辑模式,并且两个selectOneMenus 以红色突出显示。但发生的情况是该行退出编辑模式,保留旧值。如果我再次编辑它,它会显示提交的值,并且无效的单元格会标记为红色。只要我尝试提交无效值,这种行为就会持续下去。如果我关闭编辑模式,无效值将被丢弃,并且该行仅保留旧值(无论是在查看模式还是编辑模式下)。

我该如何解决这个问题?来自Primefaces 的展示 http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml,可以看到,当您尝试提交(比方说)年份单元格中包含字母字符的字符串时,该行将保持编辑模式并突出显示。我想实现同样的行为。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使 Primefaces 的数据表行在行版本上无效 的相关文章

  • 如何对给定列和方向的数据表进行排序?

    我需要在内存中使用基于来自 GridView 的列和方向的 DataTable 该函数需要如下所示 public static DataTable resort DataTable dt string colName string dire
  • 在 C# 中扩展数据表

    类的静态构造函数SourceManager遍历所有模块 类并发现所有实现的类ISource 它将实例化其中每一个并公开一个IEnumerable其中作为静态属性称为IEnumerable
  • ui:decorate 和 ui:include 之间真正的概念区别是什么?

    发生在我之前ui decorate功能上与ui include除了你也可以通过ui param and ui define到包含的文件 我疯了吗 EDIT 虽然事实上你可以通过ui param to a ui include文件也一样 事实
  • 数据表中的 NA

    我有一个data table其中包含一些组 我对每个组进行操作 有些组返回数字 其他组返回NA 因为某些原因data table很难将所有东西重新组合在一起 这是一个错误还是我误解了 这是一个例子 dtb lt data table a 1
  • 保护 JSF 应用程序的安全

    我的一位自由职业者朋友邀请我加入他的 JSF 2 0 项目 我正在慢慢加快速度并将各个部分整合在一起 来自 Windows Forms NET 世界 至少可以说 我还有很多东西需要学习 我主要担心的是对于如何保护 JSF 应用程序缺乏明显的
  • 使用 fread 导入数据后所有列均作为字符

    我导入了一个 CSV 文件 包含文本列和数字列 x lt fread myfile csv header TRUE verbose T na strings c null null 但导入后 当我运行summary x 时 所有列都被视为字
  • data.table:从不存在的列到现有列的“get”失败,静默失败

    gt d lt data table x 1 5 gt d x 6 y get i 9 Error in get i 9 object i 9 not found gt d y 1 add a new column y gt d x 6 y
  • 向控制器发送参数

    我懂了
  • 复合组件和 CSS

    I have newcss css formdiv width 30 margin 150 auto 和复合组件
  • 如何更改数据表中的少数列名称

    我有一个包含 10 列的数据表 town tc one two three four five six seven total 需要生成我正在使用的列 一 到 总计 的平均值 DTmean lt DT lapply SD mean by t
  • 使用 f:ajax 渲染多个组件

    错误的代码是
  • JSF-2 应用程序中的服务器端计时器

    在我正在开发的 JSF 2 应用程序中 当用户执行操作时 我需要启动服务器端计时器 这个计时器必须与应用程序本身相关 因此它必须在用户会话关闭时继续存在 为了解决这个问题 我想使用 java util Timer 类在应用程序范围的 bea
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • 无法在 JSF 应用程序中解析文档 faces-config.xml

    我正在开发一个 JSF Web 应用程序 我将 JSF 2 2 与 Apache Tomcat 8 0 27 0 结合使用 当我按 clean build 时 它工作正常 但是当我尝试运行我的应用程序时 我收到此异常 com sun fac
  • R Data.Table 创建带有条件的变量

    我需要在下面的数据集中创建一个新变量 A X a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 The newvar如果X等于 2 5 7 或 9 否则 newvar应该是 0 Code dt1 lt dat
  • Richfaces 与 Internet Explorer 11 的兼容性问题

    我正在使用 RichFaces JSF 开发 Web 应用程序 该应用程序在 Safari Mozilla Chrome 和 IE 9 上的表现符合预期 但是 我在 IE 11 上遇到了严重的兼容性问题 当 rich modalPanel
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 在会话即将到期之前调用方法

    我的网络应用程序有登录的用户 有一个超时 在会话过期之前 我想执行一个方法来清理一些锁 我已经实现了sessionListener但一旦我到达public void sessionDestroyed HttpSessionEvent eve
  • R data.table 连接不等式条件

    我想使用 data table 包根据多个不等式条件对数据进行子集化 data table 手册中的示例展示了如何使用字符变量执行此操作 但不显示数字不等式 我还了解了如何使用子集函数来执行此操作 但我真的很想利用 data table 二
  • 在 FacesConverter 中使用 ManagedBean

    我想用ManagedBean in my Converter The ManagedBean负责从数据库获取数据 在Converter我想将字符串转换为必须从数据库获取的对象 这是我的转换器 FacesConverter forClass

随机推荐