Вам просто нужно реализовать интерфейс Validator
.
@FacesValidator("myValidator")
public class MyValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// ...
if (valueIsInvalid) {
throw new ValidatorException(new FacesMessage("Value is invalid!"));
}
}
}
@FacesValidator
зарегистрирует его в JSF с идентификатором валидатора myValidator
так что вы можете ссылаться на него в атрибуте validator
любого компонента <h:inputXxx>
/ <h:selectXxx>
следующим образом:
<h:inputText id="foo" value="#{bean.foo}" validator="myValidator" />
<h:message for="foo" />
Вы также можете использовать <f:validator>
, что будет единственным способом, если вы намереваетесьЧтобы присоединить несколько валидаторов к одному и тому же компоненту:
<h:inputText id="foo" value="#{bean.foo}">
<f:validator validatorId="myValidator" />
</h:inputText>
<h:message for="foo" />
Когда валидатор выбрасывает ValidatorException
, его сообщение будет отображаться в <h:message>
, связанном с полем ввода.
Вы можете использовать <f:validator binding>
для ссылки на конкретный экземпляр валидатора где-нибудь в области видимости EL, который, в свою очередь, может быть легко предоставлен как лямбда:
<h:inputText id="foo" value="#{bean.foo}">
<f:validator binding="#{bean.validator}" />
</h:inputText>
<h:message for="foo" />
public Validator getValidator() {
return (context, component, value) -> {
// ...
if (valueIsInvalid) {
throw new ValidatorException(new FacesMessage("Value is invalid!"));
}
};
}
Чтобы получитьшаг вперед, вы можете использовать проверку bean-компонента JSR303.Это проверяет поля на основе аннотаций.Поскольку это будет целая история, вот лишь несколько ссылок для начала:
Параметр <f:validateBean>
полезен только в том случае, если вы намереваетесь отключить проверку bean-компонента JSR303.Затем вы помещаете входные компоненты (или даже целую форму) внутрь <f:validateBean disabled="true">
.
См. Также: