Метод валидатора не найден - PullRequest
0 голосов
/ 14 декабря 2011

Я пишу страницу JSF, где пользователь может изменить свой пароль.Я основал свое решение на примере кода из книги JavaServer Faces (3-е издание) Дэвида Гири и Кей С. Хорстманна.Вот мой код:

<h:inputText id="oldPassword" required="true"
    validator="#{accountBean.validateOldPassword}">
    <f:ajax event="blur" render="oldPasswordError" />
</h:inputText>
<h:message for="oldPassword" id="oldPasswordError" style="color: red" />

Часть AccountBean.java :

@Named("accountBean")
@SessionScoped
public class AccountBean implements Serializable {
    private String login;
    private String password;

    (...)
    public void validateOldPassword(FacesContext context, UIComponent component, Object value) {
        if (!(((String)value).equals(password)))
            throw new ValidatorException(new FacesMessage("Invalid password"));
    }
}

Теперь, когда я разверну это в JBoss AS 7.0.2 и попытаюсьЯ получаю такую ​​ошибку рядом со старым паролем:

/changePassword.xhtml @28,54 validator="#{accountBean.validateOldPassword}": Method not found: pl.edu.pw.mini.smartdialer.presentation.AccountBean@d1ff44.validateOldPassword(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)

Он утверждает, что метод не может быть найден, почему?Это почти копирование / вставка из книги и до сих пор не работает.Я понятия не имею, где найти ошибку.Не могли бы вы помочь мне?

1 Ответ

1 голос
/ 22 декабря 2011

Согласно комментариям, аннотации CDI, похоже, не работают вообще.

Чтобы заставить их работать, вам нужно поместить файл beans.xml в папку /WEB-INF. Этот файл можно оставить пустым. Достаточно только наличия файла с точно таким именем в этом месте, чтобы контейнер мог начать сканирование классов с аннотациями CDI.

Если эти классы находятся внутри файла JAR, который, в свою очередь, включен в /WEB-INF/lib, то вместо этого вы должны поместить этот файл в папку /META-INF JAR.

Это сделано для того, чтобы избежать ненужного сканирования аннотаций при запуске контейнера. Сканирование весь classpath для аннотаций является относительно дорогой работой, которая может замедлить запуск контейнера. Вот почему вам нужен файл beans.xml, чтобы запустить его для каждого WAR-файла и JAR-сервера. Эта же конструкция, кстати, также применяется JSF с faces-config.xml. Если этот файл отсутствует в WAR или JAR, JSF не будет сканировать аннотации, специфичные для JSF, в WAR или JAR.

...