当DB约束验证失败时,在p:inplace中重置p:inputText的值

时间:2012-10-15 09:40:12

标签: java jsf primefaces

我有这段代码:

<p:inplace id="staffno" editor="true">
                    <p:ajax event="save" listener="#{staffbean.onSave}" update="staffnoInplace messages" />                    
                    <p:inputText id="staffnoInplace" value="#{staffbean.vieweditStaff.staffno}"/>                                                 
</p:inplace>  

在staffbean.onSave()中,我通过JPA / Hibernate存储它。在它成功的情况下,我没有遇到任何问题。它存储在DB中。

我的问题与Hibernate因DB约束引发异常的情况有关。在这些情况下,我希望在适当的位置保持可编辑状态而不是更改值。目前,它在数据库级别上失败,但我仍然看到UI对象上的值更改为不正确的值。

1 个答案:

答案 0 :(得分:2)

您应该为inputText组件包含验证方法或验证器,以便在数据库中已存在给定ID时反转bean值并阻止执行onSave事件。

故意尝试将记录插入数据库希望数据库约束提供验证是一种模糊的数据安全实践。我并不是说数据库约束很糟糕,我只是说在尝试插入数据库之前,你应该尽一切努力验证和补充输入。

在托管bean中包含验证方法,如:

public void validateStaffNoId(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    //Query DB to see if ID exists...
    if (idExists()) {
        //Throw validator exception
    }
}

然后在inputText组件中添加属性:

<p:inputText ... validator="#{staffBean.validateStaffNoId}" ... />