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