我正在使用JSF 2.1 Primefaces 5.1开发一个web应用程序 . 我有一个可编辑行的数据表 . 我捕获 rowEdit 事件并调用数据库过程来对新数据进行一些验证,并在用户单击"check"按钮时更新记录 . 但是存在一个问题:无论验证成功还是失败,GUI中的数据表行都会更新 . 如果在DB过程中完成的验证失败,我希望将行数据中的更改反转到之前的状态 . 我怎样才能做到这一点?

<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}"/>
            <p:ajax event="rowEditInit" listener="#{usersBean.onRowEditInit}"/>
            <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 styleClass="datatable-row-editor">
                <p:rowEditor/>
            </p:column>
</p:dataTable>
@ManagedBean
@ViewScoped
public class UsersBean implements Serializable {

    private List<DtoUser> users;

    public void onRowEdit(RowEditEvent event) {
        logger.entry();
        DtoUser dtoUser = (DtoUser)event.getObject();
        this.updateUser(dtoUser);
        logger.exit();
    }

    public void updateUser(DtoUser dtoUser) { 
        try {
            logger.entry(dtoUser);
            DtoBoUsers dtoBoUsers = dtoUser.toDtoBoUsers();
            DtoTypeGenericResponse genericResponse = usersService.updateUser(dtoBoUsers);
            if (genericResponse.isError()) {
                // error in user update
            } else {
                // update successful
            }
            logger.exit(dtoUser);
        } catch (Exception e) {
            logger.error(ExceptionUtils.getStackTrace(e.fillInStackTrace()));
        }
    }
}