javax.el.ELException: не удалось найти свойство actionMethod в классе com.example.Bean
При развертывании приложения GAE + primefaces я получил следующую ошибку:
com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException: Error Rendering View[/CreateEmployee.xhtml]
javax.el.ELException: /CreateEmployee.xhtml: Could not find property saveEmployee in class com.fetchinglife.domain.data.dao.EmployeeRepositoryImpl
at com.sun.faces.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:94)
at com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
Четное saveEmployee
уже в EmployeeRepositoryImpl
учебный класс. Как это вызвано и как я могу решить это? Есть ли какие-то аннотации, которые я должен добавить дополнительно?
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 (который вы можете увидеть, щелкнув правой кнопкой мыши, Просмотреть источник в браузере).
Это может иметь несколько причин:
Пространство имен XML компонента неверно или отсутствует. Например, в случае PrimeFaces вы случайно использовали старый URI PrimeFaces 2.x, в то время как вы фактически используете 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, содержащие определения тегов библиотеки компонентов.
/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>
,