最近、自分の JSF アプリがデータテーブルの行をテーブル自体で編集するというビジネス要件を受け取りました。
問題:
テーブルは JPA エンティティのリストによって支えられていますが、編集可能なフィールドはそれらの (オプションの) 関連付けに属しています。したがって、そのような編集可能なselectOneListbox
フィールドの例として、次のようにします。
<h:selectOneListbox id="rca" value="#{mainEntity.associatedEntity.rca}" converter="omnifaces.SelectItemsConverter">
<f:selectItem itemValue="#{null}" itemLabel="" />
<f:selectItems value="#{rcaOptions}" var="rca" itemLabel="#{rca}" itemValue="#{rca}" />
</h:selectOneListbox>
Target Unreachable, 'associatedEntity' returned null
テーブルを送信すると、エンティティがまだ関連付けられていない行については、それらの行を変更せずにそのselectOneListbox
ままにしておいても (null オプションが選択されています) 、最終的に受け取ります。
質問:
フォームを送信するときに、どのように/どこで/いつ新しいサブエンティティをエレガントにインスタンス化できますか? テーブルを最初にレンダリングするときに、すべての行のモデルにサブエンティティを強制的に作成することは、IMHO の設計上の欠陥です。
selectOneListbox
フィールドがリクエストに存在しなかった場合と同様に、条件付きで、JSF ライフサイクル全体からこれ (または他の入力フィールド) をプログラムで無視するにはどうすればよいですか? いくつかのコンバーターとバリデーターを実装しようとしましたが、検証フェーズはまだ値の参照を取得しようとしています。何を試しても、上記のエラーがスローされます