ボタンがクリックされたときにJSFでJSR-303 Bean検証をスキップする方法は?
いくつかのアプローチを説明するための少し長い質問...次の形式のリストを検討してください。
<h:form id="form">
<h:commandButton value="Add row">
<f:ajax execute="foo" listener="#{bean.add()}" render="foo" />
</h:commandButton>
<h:dataTable id="foo" var="foo" value="#{bean.foos}">
<h:column>
Name: <h:inputText id="field" value="#{foo.name}" required="true" />
<h:messages for="field" />
</h:column>
<h:column>
<h:commandButton value="Remove">
<f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
ユーザーが行の追加または削除をクリックすると、アクションは検証なしで実行されます。問題は、JSF がリスト全体を再レンダリングし、それを検証しようとすることです。検証されない下書きの変更がある場合、検証エラーが発生し、リスナー メソッドが呼び出されることはありません (検証に失敗するとそれが妨げられるため)。ただし、immediate="true"
f:ajax に追加すると、検証エラーがあってもメソッドを実行できます。ただし、検証エラーは引き続き発生し、ここに表示されます。
2 つのオプションが表示されます。
1) immediate="true" を使用し、検証エラーを表示しない
検証しないボタンの場合、immediate="true" を設定し、h:messages の場合は次のようにします。
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
次に、そのパラメーターを送信するように Save-button (実際にフォームを保存しようとする必要があります) を設定します。
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
SHOW_VALIDATION
これにより検証が行われますが、パラメーターが存在する場合を除いてメッセージは表示されません。
2) 条件付きで facelets の検証を宣言します。
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
そして保存ボタン:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
VALIDATE
これにより、パラメーターが存在する場合 (= [保存] ボタンが押された場合) にのみフィールドが検証されます。
しかし、これらは一種のハックのようです。JSR-303 Bean Validation を単純に使用して、宣言時にスキップするにはどうすればよいですか?