Как выполнить проверку в JSF, как создать собственный валидатор в JSF - PullRequest
7 голосов
/ 18 мая 2011

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

1 Ответ

16 голосов
/ 18 мая 2011

Вам просто нужно реализовать интерфейс 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">.

См. Также:

...