Проблема пользовательской проверки JSF 2.0 - PullRequest
2 голосов
/ 04 марта 2011

Я хочу проверить входные данные для моей JSF-страницы внутри моего управляемого компонента, но по какой-то причине это не работает?

@ManagedBean
@RequestScoped
public class RegistrationController {
//values passed from the JSF page
private String name; 
...
public void validateName(FacesContext context, UIComponent validate,
        Object value) {
    String inputFromField = (String) value;
    String simpleTextPatternText = "^[a-zA-Z0-9]+$";
    Pattern textPattern = null;
    Matcher nameMatcher = null;
    textPattern = Pattern.compile(simpleTextPatternText);
    nameMatcher = textPattern.matcher(getName());

    if (!nameMatcher.matches()) {
        ((UIInput) validate).setValid(false);
        FacesMessage msg = new FacesMessage(
                "your name cant contain special characters");
        context.addMessage(validate.getClientId(), msg);
    }
}

Вот так выглядит компонент ввода (внутри формы):

<h:inputText value="#{registrationController.name}" validator="#{registrationController.validateName}" required="true">
        <h:message for="nameInput"/>

Когда я ввожу неправильный ввод, я не вижу сообщения проверки, и в консоли я вижу это:

ИНФОРМАЦИЯ: Создан экземпляр экземпляра org.hibernate.validator.engine.resolver.JPATraversableResolver. ИНФОРМАЦИЯ: ПРЕДУПРЕЖДЕНИЕ: FacesMessage (s) были поставлены в очередь, но, возможно, не отображались. sourceId = bRegForm: j_idt7 [серьезность = (ОШИБКА 2), сводка = (bRegForm: j_idt7: Ошибка проверки: требуется значение.), подробно = (bRegForm: j_idt7: Ошибка проверки: требуется значение.)]

Что бы это могло быть? Я что-то забыл? Должен ли я что-то добавить в мои файлы конфигурации ...?

1 Ответ

4 голосов
/ 04 марта 2011

Вы забыли дать вашему компоненту ввода id.Именно на это должен указывать атрибут for <h:message>.

<h:inputText id="nameInput">

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

((UIInput) validate).setValid(false);
context.addMessage(validate.getClientId(), msg);

do

throw new ValidatorException(msg);

Тогда JSF будет беспокоиться о том, чтобы установить компонент как недействительный и добавить сообщение в контекст.


Естьвторая проблема, вы проверяете локальное значение вместо переданного значения.

Замените

nameMatcher = textPattern.matcher(getName());

на

nameMatcher = textPattern.matcher(inputFromField);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...