У меня была та же проблема, и мне не нравилась идея пропустить все проверки.После долгих раздумий я в итоге захотел только пропустить проверку обязательных полей.Логика этого заключается в том, что пользователь либо заполняет поле правильно , либо не заполняет его вообще.Это очень важно для меня, потому что все заканчивается в базе данных и, конечно, я не хочу переполнять поле базы данных или в конечном итоге сохранить значение String
в поле базы данных INT
, например.
По моему опыту, пропуск обязательных полей позволяет достаточно запаса маневра, чтобы сохранить черновик.Чтобы добиться этого, я написал requiredWarnValidator
, который показывает одно предупреждающее сообщение.
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
if (value == null) {
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_WARN);
message.setSummary("This field is required.");
context.addMessage(component.getClientId(), message);
context.validationFailed();
}
}
В этом валидаторе я не выбрасываю ValidatorException()
, потому что хочу пройти фазу валидации, но я вызываюvalidationFailed()
потому что я хочу знать, не заполнено ли обязательное поле.
У меня есть флаг (completed
) в сущности, которую я использую для сохранения своей формы.При сохранении формы я проверяю isValidationFailed()
.
- , если
true
хотя бы одно обязательное поле не заполнено: я снимаю флажок completed
.(это черновик) - если
false
заполнена вся форма: я проверяю флаг completed
.(это не черновик)
Это также позволяет мне иметь одну кнопку «Сохранить» вместо двух кнопок («Сохранить» и «Сохранить как черновик»).
Примечания и известные подводные камни:
- Если вы сохраняете свой черновик в базе данных, вы должны убедиться, что нет никаких ограничений
NOT NULL
. - При использовании преобразователей и валидаторов вы должны убедиться, что они могут обрабатывать значения
NULL
. - Вы потеряете звездочку обязательного поля в
outputLabel
для своих полей.