Атрибут валидатора Inputtext, установленный существующим полем в bakedbean - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть некоторый входной текст в форме, которой управляет bean-компонент @Named, и я хотел бы централизовать информацию, касающуюся этих полей, например, какой валидатор назначен какому полю.

Если я непосредственно пишуимя @FaceValidator, оно работает.

<h:inputText validator="validatorLogin"/>

Если я попытался поместить имя валидатора со свойством bean-компонента, например String validatorLogin = validatorLogin.

Это вызовет ошибкув .xhtml, например, «Выражение должно быть выражением метода, но является выражением значения».

Если я попытаюсь все еще выполнить код, он выдаст следующее исключение «validator = # {bean.validatorLogin}: Методnot found ".

<h:inputText validator="#{bean.validatorLogin}"/>

Я ожидаю, что имя bean-компонента будет установлено в bean-компоненте, а bean-компонент будет передавать идентификатор валидатора в поле inputtext.Таким образом, вся информация о форме централизована в одном компоненте.

Также глупо ли это делать или что-то, что сделает код более организованным?

1 Ответ

1 голос
/ 08 апреля 2019

Как указано в документации атрибута validator, для этого атрибута нет способа предоставить validatorId через свойство bean:

validator: MethodExpression , представляющий метод проверки, который будет вызван во время валидации процесса для проверки правильности значения этого компонента. Выражение должно оцениваться для публичного метода , который принимает параметры FacesContext, UIComponent и Object с тип возврата void.

Обычно вы либо жестко кодируете validatorId, как вы делали в первом примере, либо method expression (во втором примере), который разрешает метод, подобный следующему:

public void validatorLogin(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    // ...
}

Конечно, до реализации этого компонента как проверяется ввод. Если вы хотите объединить оба подхода, вы можете делегировать валидацию одному (или нескольким) валидаторам, известным по ID в вашем методе validatorLogin:

public void validatorLogin(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    final Collection<String> validatorIds = determineValidatorIds(context, component);
    for (String validatorId : validatorIds) {
        Validator<Object> validator = context.getApplication().createValidator(validatorId);
        validator.validate(context, component, value);
    }
}

private Collection<String> determineValidatorIds(FacesContext context, UIComponent component) {
    // return hard coded validatorIDs or determine them on arbitrary logic.
}

Если вам срочно нужно предоставить validatorId через свойство bean-компонента, вы можете сделать это, используя тег f:validator в компоненте ввода:

<h:inputText id="txt" value="#{myBean.textValue}">
    <f:validator validatorId="#{myBean.arbitraryValidatorId}" />
</h:inputText>
...