Как выполнить проверку в JSF, как создать пользовательский валидатор в JSF

Я бы хотел, чтобы выполнить проверку в некоторых из моих входных компонентов, таких как <h:inputText> используя некоторый метод Java bean. Должен ли я использовать <f:validator> или <f:validateBean> для этого? Где я могу прочитать больше об этом?

1 ответов


вам просто нужно использовать тег 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, так что вы можете ссылаться на него в любой <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" />

когда валидатор бросает!--12-->, то его сообщение будет отображаться в элементе <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!"));
        }
    };
}

чтобы сделать шаг дальше, вы можете использовать проверку jsr303 bean. Это проверяет поля на основе аннотаций. Поскольку это будет целая история, вот только некоторые ссылки, чтобы получить начал:

на <f:validateBean> полезно только если вы намереваетесь отключить проверка бобов JSR303. Затем вы помещаете входные компоненты (или даже всю форму) внутрь <f:validateBean disabled="true">.

Читайте также: