1

我正在使用 Mojarra、Primefaces 3.4 和 JSF 2.1 以及 JPA/Hibernate 来实现持久性。

最好将问题描述为具有一个 bean 和一个视图以及一个自定义验证器,我在其中将一个数字输入到一个具有验证器的字段中。验证器通过后端检查数据库中的字段值,并防止创建重复的对象。

在所有情况下,验证都可以防止在第一次提交时提交重复的对象。但是,有几次它只允许后续(第二次)提交通过并被持久化(尽管对于具有验证器的这个特定字段具有空值),即使第一次提交时出现失效失败。

我无法理解为什么会发生这种情况,但怀疑与范围有关。我已经尝试过 CDI 的 @ConversationScoped 和 @RequestScoped,以及 MyFaces CODI @ViewAccessScoped。

@RequestScoped 似乎“解决”了这个问题,但还有一些其他问题,即它在第一次失效后根本无法持久,因为(可能)在第一次提交后没有保留值。此外,标识符上有一个 AJAX 调用,它将尝试从另一个系统检索客户数据。如果成功,所有其他字段都应该是只读的,这在客户数据检索过程中通过布尔集进行处理。@RequestScoped 无法处理此问题,因为该值在第一次提交后“丢失”。

整个代码非常广泛,如果您想查看其中的任何特定部分以回答此问题,请告诉我。

分步说明:

  1. 导航到页面。
  2. 尝试使用现有的唯一标识符和提交来创建重复对象。
  3. 显示表单以及自定义验证器错误。
  4. 第二次尝试提交相同的页面(不重新加载页面)。
  5. 页面已成功提交并持久化,但唯一标识符未提交并且在数据库中具有空值。

这不会每次都发生,这是令人困惑的部分。然而,它发生在大约 50% 的情况下,没有我可以检测到的模式。

4

0 回答 0