Ответ 1
Позвольте перефразировать исключение в общем формате, чтобы лучше понять причину:
javax.el.ELException: не удалось найти свойство doSomething в классе com.example.Bean
Это исключение буквально пытается сказать вам, что класс Bean
не имеет следующего метода:
public SomeObject getDoSomething() {
return someObject;
}
(где SomeObject
- тип свойства doSomething
)
Для этого существует несколько причин.
Выражение метода действия неправильно интерпретируется как выражение значения свойства
Учитывая тот факт, что имя свойства в вашем случае на самом деле является комбинацией глагола и существительного, резонирующей причиной является некорректная привязка метода действия к атрибуту некоторого компонента JSF, который фактически принимает выражение значения, а не метод выражение. Например. когда вы случайно делаете
<h:commandButton value="#{bean.doSomething}">Save</h:commandButton>
или даже
<h:button value="Save" outcome="#{bean.doSomething}" />
вместо
<h:commandButton value="Save" action="#{bean.doSomething}" />
В последнем случае ожидается следующий метод, который вы, вероятно, действительно имеете:
public String doSomething() {
// ...
return "nextpage";
}
(который также может быть объявлен возвратом void
кстати)
Компонент не разрешен вообще
Другая возможная причина заключается в том, что компонент не интерпретируется как реальный компонент вообще, а как "простой текст". Другими словами, когда вы удаляете атрибут action
, а затем пытаетесь открыть страницу JSF в браузере, он теперь будет загружаться в порядке, но вы увидите, что весь компонент не проанализирован в сгенерированном HTML-выходе (который вы можете увидеть с помощью rightclick, Просмотр источника в браузере).
Это может иметь несколько причин:
-
Пространство имен XML компонента неверно или отсутствует. Например. в случае PrimeFaces вы случайно использовали старый PrimeFaces 2.x URI, в то время как вы фактически используете PrimeFaces 3 +.
<html ... xmlns:p="http://primefaces.prime.com.tr/ui">
-
URI пространства имен XML содержит опечатку.
<html ... xmlns:p="http://primefaecs.org/ui">
-
Префикс пространства имен XML не совпадает.
<html ... xmlns:pf="http://primefaces.org/ui">
-
Пространство имен XML полностью отсутствует.
<html ...>
-
Библиотека компонентов вообще не установлена. Другими словами, JAR, содержащие определения тегов библиотеки компонентов, отсутствует в папке webapp
/WEB-INF/lib
.
В любом случае, тег <p:xxx>
не будет анализироваться и рассматриваться как текст шаблона. Но все EL-выражения будут по-прежнему оценены (как будто вы используете <p>#{bean.text}</p>
), и все они будут вести себя как ValueExpression
вместо MethodExpression
s.
Простым способом распознавания основной причины является поиск трассировки стека. Если вы видите com.sun.faces.facelets.compiler.AttributeInstruction
в трассировке стека, это означает, что компонент интерпретируется как "обычный текст". В противном случае вы бы видели, например. org.primefaces.component.commandbutton.CommandButton
в конкретном случае <p:commandButton>
.