Как пропустить проверку JSR-303 Bean с помощью JSF, когда нажата кнопка?
Несколько длинный вопрос, чтобы объяснить несколько подходов... Рассмотрим список в форме:
<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 позволяет выполнять метод, несмотря на ошибки проверки. Тем не менее, ошибки проверки все еще встречаются и показаны здесь.
Я вижу два варианта:
1) Используйте немедленное = "true" и не показывайте ошибки проверки
Для неавтоматизирующих кнопок установите немедленное = "true" и для h: сообщения выполните:
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
Затем установите Save-button (на самом деле попытайтесь сохранить форму), чтобы отправить этот параметр:
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
Это вызывает проверку, но сообщения просто не отображаются, кроме случаев, когда присутствует параметр SHOW_VALIDATION
.
2) Объявить валидацию в треугольниках условно:
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
И Сохранить кнопку:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
Это приводит к тому, что поля проверяются только при наличии параметра VALIDATE
(= при нажатии кнопки "Сохранить" ).
Но это похоже на хаки. Как я могу просто использовать JSR-303 Bean Validation, но пропустить его при объявлении?