Javax.el.ELException: Ошибка чтения 'foo' в типе com.example.Bean

Я читаю следующий учебник:

Выражение, используемое в значении h: dataTable/@, обычно задает свойство     имя, для которого был определен геттер, что означает, что в контроллере     Класс BookController содержит книги свойств (необязательно), а также     метод с именем getBooks (это обязательно). В этом конкретном случае это     достаточно для определения метода getBooks, так как нет необходимости в     books в классе контроллера

Я пытаюсь работать над такой идеей в своем затмении и tomcat 7. но он продолжает обрабатывать меня:

javax.el.ELException:/views/books/listAll.xhtml @9,60 value = "# {bookController.books}": Ошибка чтения "книг" по типу pl.ctrl.BookController

Мой вопрос: возможно ли:

<h:dataTable value="#{bookController.books}" var="b">

Пока нет свойства books, но только getBooks() метод getter в #{bookController} bean

Ответ 1

Ваша проблема отличается от того, что говорит книга. Если JSF/EL не смог полностью найти метод геттера, вы получили бы следующее исключение:

javax.el.PropertyNotFoundException: свойство 'books' не найдено по типу pl.ctrl.BookController

Или, если он не смог найти сам bean:

javax.el.PropertyNotFoundException: Target Unreachable, идентификатор 'bookController' разрешен для null

Но вместо этого вы получили:

javax.el.ELException: Ошибка чтения "книг" по типу pl.ctrl.BookController

Это означает, что был найден метод bean и getter, но вызов метода getter вызвал исключение. В основном, под оболочками JSF/EL происходит следующее:

try {
    Object result = bookController.getBooks();
} catch (Exception e) {
    throw new ELException("Error reading 'books' on type pl.ctrl.BookController", e);
}

Обратите внимание, что e передается как причина ELException. Исходное исключение, таким образом, должно быть видимым как "Caused by" далее в трассировке стека, которое вы не отправляли нигде в вопросе. Самый нижний из них является основной причиной всех и является ответом на вашу конкретную проблему. Если вы не можете его интерпретировать, просто скопируйте тип исключения и сообщение в подходящую поисковую систему, чтобы найти ответы и подсказки.


Несвязанный к конкретной проблеме, исключение, выведенное из метода геттера, в свою очередь указывает на рыбный код. Метод геттера не должен делать какую-либо исключающую чувствительность бизнес-логику. А именно, он может быть вызван несколько раз за жизнь bean и повторять ту же самую бизнес-логику много раз в течение всего bean, жизнь неэффективна. Прекратите это делать и переместите бизнес-логику на одноразовую процедуру инициализации или действия/события. Метод getter должен просто вернуть уже подготовленное свойство. См. Также Почему JSF вызывает геттеры несколько раз и Как и когда следует загружать модель из базы данных для h: dataTable.