Как указать валидатор для компонента ввода внутри составного компонента? - PullRequest
5 голосов
/ 08 января 2012

Должен ли я зарегистрировать пользовательский валидатор в faces-config.xml, если я использую JSF 2.0.4?Мой пользовательский валидатор использует интерфейс Validator, который javax.faces.validator.Validator.

<cc:myComp id="customcomp1" ... />

<cc:myComp id="customcomp2" ...>
    <f:validator id="myvalidator" for="myComp" />
</cc:myComp>

myComp.xhtml

<cc:interface>
    <cc:attribute ... />
    <!-- more attributes -->
</cc:interface>
<cc:implementation>
    <h:panelGroup layout="block">
        <h:inputText id="firstName" ... />
        <h:inputText id="middleName" ... />
        <h:inputText id="lastName" ... />
    </h:panelGroup>
</cc:implementation>

Ответы [ 3 ]

5 голосов
/ 09 января 2012

Согласно примеру кода в вашем обновленном вопросе, вы, похоже, вообще не делегируете валидатор правильному вводу, поэтому валидатор просто полностью игнорируется.

Вам необходимо определить желаемый ввод (для которого вы хотите присоединить валидатор) как <composite:editableValueHolder> в <composite:interface>.

<cc:interface>
    <cc:editableValueHolder name="forName" targets="inputId" />
    ...
</cc:interface>
<cc:implementation>
    ...
    <h:inputText id="inputId" ... />
    ...
</cc:implementation>

Выше <composite:editableValueHolder> в основном говорит, что любой <f:validator for="forName"> долженнаноситься на <h:inputText id="inputId">.Таким образом, следующее должно сделать это:

<cc:myComp>
    <f:validator id="myValidator" for="forName" />
</cc:myComp>

Вы можете даже использовать одно и то же значение в name и targets, но ключевой момент заключается в том, что должен присутствовать <composite:editableValueHolder>, чтобыJSF знает, на какой именно компонент ввода должен быть нацелен валидатор, а в композите может быть несколько компонентов ввода, видите ли.

3 голосов
/ 09 января 2012

Если вы работаете с JSF 2, я не думаю, что вам нужно прикасаться к файлу faces-config.xml, чтобы создать клиента Validator.Вы можете просто использовать аннотацию @FacesValidator, чтобы объявить Validator.Это должно быть что-то вроде этого:

@FacesValidator("myValidator")
public class MyValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        // Your logic
    }

}

Затем вы можете начать использовать его на своей странице .xhtml, например, с тегом <f:validator>:

<f:validator validatorId="myValidator" />
1 голос
/ 09 января 2012

Нет. Это не обязательно с JSF 2.0. Просто аннотируйте свой валидатор с помощью @FacesValidator. Аннотация автоматически регистрирует ваш валидатор. XML не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...