Mojarra、Primefaces 3.4、および JSF 2.1 を、永続化のために JPA/Hibernate と共に使用しています。
この問題は、カスタム バリデータと共に Bean とビューがあり、バリデータのあるフィールドに数値を入力する場合に最もよく説明されます。バリデーターは、バックエンドを介して DB 内のフィールド値をチェックし、重複するオブジェクトが作成されるのを防ぎます。
検証により、すべての場合において、最初の送信時に重複するオブジェクトが送信されるのを防ぎます。ただし、最初の送信で無効化の失敗があったとしても、後続の (2 番目の) 送信が通過して永続化される (バリデーターを持つこの特定のフィールドの値が null であっても) ことができる場合が数回あります。
なぜこれが起こっているのか理解できませんが、スコープに関連する何かを疑っています。CDI の @ConversationScoped と @RequestScoped、および MyFaces CODI @ViewAccessScoped を試しました。
@RequestScoped はこの問題を「解決」しているように見えますが、他にもいくつかの問題があります。つまり、(おそらく) 最初の送信後に値が保持されないため、最初の無効化後にはまったく保持できません。さらに、別のシステムから顧客データを取得しようとする識別子に AJAX 呼び出しがあります。成功した場合、他のすべてのフィールドは読み取り専用にする必要があります。これは、顧客データの取得プロセス中にブール値セットを介して処理されます。@RequestScoped は、最初の送信後に値が「失われる」ため、これを処理できません。
コード全体は非常に広範囲に及ぶため、この質問に回答するために見たい特定の部分がある場合はお知らせください。
段階的な説明:
- ページに移動します。
- 既存の一意の識別子と送信を使用して、重複するオブジェクトを作成しようとしています。
- フォームとカスタム バリデータ エラーが表示されます。
- 同じページを送信する 2 回目の試行 (ページをリロードせずに)。
- ページは正常に送信されて永続化されますが、一意の識別子は送信されず、DB に null 値があります。
これは毎回発生するわけではなく、混乱を招く部分です。ただし、おそらく 50% のケースで発生し、パターンを検出できませんでした。