PrimeFaces Datatable CellEditor-方面输入和输出的不同值

PrimeFaces Datatable CellEditor-方面输入和输出的不同值,primefaces,datatable,jsf-2.2,tablecelleditor,primefaces-datatable,Primefaces,Datatable,Jsf 2.2,Tablecelleditor,Primefaces Datatable,我有一个实体用户的可编辑数据表。此表有一个名为username的字段,该字段具有唯一约束 <h:form id="form"> <p:dataTable id="userTable" value="#{users}" var="entity" editable="true" editMode="cell" tableStyle="width:auto"> <p:ajax event="cellEdit" listener="#{userController.

我有一个实体用户的可编辑数据表。此表有一个名为username的字段,该字段具有唯一约束

    <h:form id="form">
<p:dataTable id="userTable" value="#{users}" var="entity" editable="true" editMode="cell" tableStyle="width:auto">
<p:ajax event="cellEdit" listener="#{userController.onCellEdit}" update="form:msgs form:display form:userTable" />
<p:column headerText="UserID">
<p:outputLabel value="#{entity.id}" />
</p:column>
<p:column headerText="Username">
<p:cellEditor>
<f:facet name="output"><p:outputLabel for="username" value="#{entity.username}" /></f:facet>
<f:facet name="input">
<p:inputText id="username" value="#{entity.username}" >
<f:validateRequired />
<f:validateLength maximum="50" />
</p:inputText>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>

问题是当捕捉到异常时,facet输入的最终值与facet输出的值不同。在这种情况下,刻面输出显示正确的值,而刻面输入显示产生异常的值。

您需要确保UIInput组件已重置为原始值。可以从CellEditEvent检索UIInput组件

以上假设您已经检查了getComponent返回的null和类型安全性。这是我们的API

public void onCellEdit(CellEditEvent event) {
        Object newValue = event.getNewValue();
        String columnName = event.getColumn().getHeaderText();
        facesContext = FacesContext.getCurrentInstance();
        User entity = facesContext.getApplication().evaluateExpressionGet(facesContext, "#{entity}", User.class);
        if(columnName.equals("Username") {
            entity.setUsername((String) newValue);
        }


        try {
            service.createOrUpdateEntity(entity);
        }
        catch (EJBTransactionRolledbackException ex) {
            Throwable t = ex.getCause();
            while (t != null) {
                t = t.getCause();
                if(t.getClass().getSimpleName().equals("SQLIntegrityConstraintViolationException")) {
                        entity.setUsername((String) event.getOldValue());
                    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Duplicate entry for the field username. Write a different username", ""));
                    break;
                }
            }
            return;
        }
        catch (Exception e) {
            e.printStackTrace();
        }
((UIInput)event.getComponent()).resetValue();