Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF Validator


Автор: neveragny 13.4.2010, 13:57
Добрый день, господа.

Вот проблема у меня, не могу добится того, что бы заработал валидатор, и в конфиге указал и все имена совпадают, но не хочет он работать.

не мог бы мне кто нибуть помочь?


код из jsp-шки
Код

<h:inputText id="title" value="#{controller.title}" size="35" required="true">
                              <f:validator validatorId="titleValidator" />
                          </h:inputText>
                          <h:message for="title"/>  //пробовал и с message и без


faces-config.xml
Код

<validator>
        <validator-id>titleValidator</validator-id>
        <validator-class>com.awaken.TitleValidator</validator-class>
    </validator>



И сам валидатор бин
Код

package com.awaken;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

/**
 * Created by IntelliJ IDEA.
 * User: ndemeshchenko
 * Date: Apr 12, 2010
 * Time: 5:21:00 PM
 */
public class TitleValidator implements Validator {
    public void validate(FacesContext facesContext, UIComponent uiComponent, Object o) throws ValidatorException {
        System.out.println("***************** IN THE VALIDATOR");
        String title = o.toString();
        if (title.equals("")) {
            FacesMessage message = new FacesMessage();
            message.setSummary("Title is required");
            throw new ValidatorException(message);
        }
    }
}


Заранее спасибо

Автор: SlavaSemushin 13.4.2010, 18:16
А где TLD-файл?

Ну и, согласно книжке, ещё нужен "обработчик дескриптора, который расширяет класс ValidatorELTag, включающий атрибуты, представленные в файле TLD, и передающий их объекту валидатора".

Это действительно весь ваш валидатор или просто "лишь бы работал"? Если весь, то он не нужен -- required="true" у вас уже есть, просто добавьте requiredMessage и всё.

Ну и можно поступить проще (чтобы не заморачиваться с TLD-файлом) -- добавить метод в какой-либо бин, который бы валидировал значение.

Автор: neveragny 14.4.2010, 13:18
за requiredMessage  спасибо, не знал.
Но я хочу конкретно через валидатор.

Цитата(SlavaSemushin @  13.4.2010,  18:16 Найти цитируемый пост)
А где TLD-файл?

Код

    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>



Цитата(SlavaSemushin @  13.4.2010,  18:16 Найти цитируемый пост)
Ну и, согласно книжке, ещё нужен "обработчик дескриптора, который расширяет класс ValidatorELTag, включающий атрибуты, представленные в файле TLD, и передающий их объекту валидатора".


А что это за обработчик дескриптора, в двух книгах, и туториалов всяких, пишут что нужно только вот это, может где-то в faces-config что-то не указал

Автор: SlavaSemushin 14.4.2010, 13:43
Так, про обработчик дескриптора не обращайте внимание -- в вашем случае он не нужен (это если бы вы собрались использовать его как тег, типа <my:requiredValidator />).

Несколько раз посмотрел на ваш код -- выглядит правильно. Предлагаю попробовать разные варианты:

- добавить <h:messages />, чтобы видеть все сообщения об ошибках
- попробовать использовать полное имя класса в качестве имени валидатора
- возможно, что-то не так со структурой JSF-документа (например, у вас отсутствует f:view)
- поместить весь код метода validate() в блок try{}catch() и логгировать возможное исключение (например, у вас там может быть NullPointerException)
- попробовать прочитать http://www.laliluna.de/articles/jsf-validation-error-handling-tutorial.html -- вдруг что-то заметите или придумаете
- попробовать вынести валидатор в метод бина (вместо отдельного класса)

Успехов!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)