javax.El.ELException: Je n'ai pas trouvé de propriété actionMethod dans class com.exemple.Haricot

lors du déploiement de L'application GAE + primefaces, j'ai eu l'erreur suivante:

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)

même saveEmployee est déjà dans la classe EmployeeRepositoryImpl . Comment cela est-il causé et comment puis-je le résoudre? Y a-t-il des annotations que je dois rajouter?

3
demandé sur BalusC 2011-10-31 10:39:50

1 réponses

reformulons l'exception dans un format général afin de mieux comprendre la cause:

javax.El.ELException: Je n'ai pas trouvé de propriété doSomething dans class com.exemple.Haricots 1519230920"

cette exception est littéralement essayer de vous dire que la classe Bean n'a pas la méthode suivante:

public SomeObject getDoSomething() {
    return someObject;
}

(où SomeObject est le type de doSomething biens)

il y a plusieurs causes à cela.

l'expression de la méthode D'Action est incorrectement interprétée comme l'expression de la valeur de la propriété

étant donné que le nom de la propriété est dans votre cas en fait une combinaison d'un verbe et d'un nom, une cause valable est vous lié incorrectement une méthode d'action à un attribut d'un composant JSF qui prend en fait une expression de valeur, pas une méthode expression. Par exemple: quand vous faites accidentellement

<h:commandButton value="#{bean.doSomething}">Save</h:commandButton>

ou même

<h:button value="Save" outcome="#{bean.doSomething}" />

au lieu de

<h:commandButton value="Save" action="#{bean.doSomething}" />

ce dernier attendrait alors la méthode suivante, que vous probablement réellement ont:

public String doSomething() {
    // ...
    return "nextpage";
}

(qui peut également être déclaré pour retourner void soit dit en passant)

La composante

N'est pas résolue du tout

une autre cause probable est que le composant n'est pas interprété du tout comme un composant réel, mais comme un"texte simple". En d'autres termes, lorsque vous supprimez l'attribut action et que vous essayez ensuite d'ouvrir la page JSF dans le navigateur, il se chargera très bien, mais vous verrez le composant entier sans précédent dans la sortie HTML générée (que vous pouvez voir via rightclick, View Source dans le navigateur).

cela peut avoir plusieurs causes:

  1. l'espace de nom XML du composant est erroné ou manquant. Par exemple: en cas de PrimeFaces vous avez accidentellement utilisé les anciennes PrimeFaces 2.X URI pendant que vous utilisez PrimeFaces 3+.

    <html ... xmlns:p="http://primefaces.prime.com.tr/ui">
    
  2. L'URI de l'espace de nom XML contient une typographie.

    <html ... xmlns:p="http://primefaecs.org/ui">
    
  3. le préfixe D'espace de noms XML ne correspond pas.

    <html ... xmlns:pf="http://primefaces.org/ui">
    
  4. l'espace de noms XML est totalement absent.

    <html ...>
    
  5. la bibliothèque de composants n'est pas installée du tout. En d'autres termes, les bocaux contenant les définitions d'étiquette de la bibliothèque de composants sont absents du dossier /WEB-INF/lib de webapp.

de toute façon, toute étiquette <p:xxx> ne sera pas analysée et sera considérée comme un texte de modèle. Mais toutes les expressions EL seront évaluées (comme si vous utilisez <p>#{bean.text}</p> ), et ils se comporteront tous comme ValueExpression s au lieu de MethodExpression s.

un moyen facile de reconnaître la cause fondamentale est de regarder la trace de pile. Si vous voyez com.sun.faces.facelets.compiler.AttributeInstruction dans la trace de la pile, alors cela signifie que le composant est interprété comme "texte brut". Sinon, vous auriez vu par exemple org.primefaces.component.commandbutton.CommandButton dans le cas spécifique de <p:commandButton> .

7
répondu BalusC 2016-04-08 07:43:41