javax.el.ELException: не удалось найти свойство actionMethod в классе com.example.Bean - PullRequest
3 голосов
/ 31 октября 2011

При развертывании приложения 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 Ответ

8 голосов
/ 31 октября 2011

Давайте перефразируем исключение в общем формате, чтобы лучше понять причину:

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 (который вы можете увидеть с помощью правого клика) , Просмотр источника в браузере).

Это может иметь несколько причин:

  1. Неверное или отсутствующее пространство имен XML компонента. Например. в случае PrimeFaces вы случайно использовали старый URI PrimeFaces 2.x, в то время как вы фактически используете PrimeFaces 3+.

    <html ... xmlns:p="http://primefaces.prime.com.tr/ui">
    
  2. URI пространства имен XML содержит опечатку.

    <html ... xmlns:p="http://primefaecs.org/ui">
    
  3. Префикс пространства имен XML не совпадает.

    <html ... xmlns:pf="http://primefaces.org/ui">
    
  4. Пространство имен XML полностью отсутствует.

    <html ...>
    
  5. Библиотека компонентов вообще не установлена. Другими словами, JAR, содержащие определения тегов библиотеки компонентов, отсутствуют в папке /WEB-INF/lib веб-приложения.

В любом случае, все теги <p:xxx> не будут проанализированы и будут рассматриваться как текст шаблона. Но все выражения EL по-прежнему будут оцениваться (как если бы вы использовали <p>#{bean.text}</p>), и все они будут вести себя как ValueExpression с вместо MethodExpression с.

Простой способ распознать основную причину - посмотреть на трассировку стека. Если вы видите com.sun.faces.facelets.compiler.AttributeInstruction в трассировке стека, то это означает, что компонент интерпретируется как «простой текст». В противном случае вы бы видели, например, org.primefaces.component.commandbutton.CommandButton в конкретном случае <p:commandButton>.

...