java - p :inputText in p:inplace when DB constraint validation failed 的重置值

标签 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 存储它。如果成功的话,我不会遇到任何问题。它存储在数据库中。

我的问题与 Hibernate 由于数据库限制而抛出异常的情况有关。在这些情况下,我希望就地保持可编辑状态并且不更改值。目前,它在数据库级别失败,但我仍然看到 UI 对象上的值更改为不正确的值。

最佳答案

您应该为 inputText 组件包含一个验证方法或 validator ,以便反转 Bean 值并防止在给定 ID 已存在时执行 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}" ... />

关于java - p :inputText in p:inplace when DB constraint validation failed 的重置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12892959/

相关文章:

java - eclipse : adding JSF 2 facet results in NullpointerException

java - 添加锯齿状二维数组的列

java - 企业 Java Webstart 分发 : use site-wide accepted certificate to sign a code-signing certificate

java - Hibernate 如何在运行时更改类或对象

java - 从支持 bean 设置参数

javascript - 如何使用 Javascript 操作 PrimeFaces 控件?

Java:迭代器/可迭代器的 Collections.list

java - JSF - 验证失败的焦点组件

maven - 将基于 Maven 的 JSF 项目部署到 Tomcat 导致 java.lang.ClassNotFoundException : javax. faces.webapp.FacesServlet

jsf - :outputScript with target ="head" not working with Primefaces 3. 5