2010-02-25 5 views
17

Avec JSF 2, vous devriez être en mesure de le faire:Utiliser EL 2.2 avec Tomcat 6.0.24

<h:commandButton action="#{myBean.myAction(myParameter)}"/> 

qui serait alors appeler la méthode d'action, en passant dans le paramètre (en supposant qu'il est un entier):

@ManagedBean 
@SessionScoped 
public class MyBean { 
    ... 
    public String myAction(Integer myParameter) { 
     // do something 
     return null; 
    } 
    ... 
} 

Cela fonctionne parfaitement sur Glassfish v3. Cependant pas sur Tomcat, vous obtenez une notification ELException de l'erreur d'analyse syntaxique

Caused by: javax.el.ELException: Error Parsing: ... 

Maintenant, il y a une documented way of making this work using EL 2.2 et la mise en œuvre de Glassfish en remplaçant le pot el-api dans le répertoire lib Tomcat, mais je reçois toujours la même erreur se produit sans la chance. Tomcat commence vraiment à me frustrer! JSF2 est destiné à être plus facile!

fragments Maven POM:

<repositories> 
    <repository> 
    <id>sun</id> 
    <url>http://download.java.net/maven/2/</url> 
    </repository> 
    <repository> 
    <id>jboss</id> 
    <url>http://repository.jboss.com/maven2/</url> 
    </repository> 
</repositories> 
... 
    <dependency> 
    <groupId>javax.el</groupId> 
    <artifactId>el-api</artifactId> 
    <version>2.2</version> 
    <scope>provided</scope> 
    </dependency> 

    <dependency> 
    <groupId>org.glassfish.web</groupId> 
    <artifactId>el-impl</artifactId> 
    <version>2.2</version> 
    <scope>provided</scope> 
    </dependency> 

Plus d'infos.

Voici une partie de la trace de la pile, il semble qu'elle utilise encore une implémentation Apache EL, et non celle que j'ai jeté dans lib. J'ai complètement enlevé le el-api.jar existant qui est venu avec Tomcat, y at-il un el-impl.jar je suis destiné à enlever quelque part aussi qui peut être quelque chose de surcharger?

Was expecting one of: 
    "}" ... 
    "." ... 
    "[" ... 
    ">" ... 
    "gt" ... 
    "<" ... 
    "lt" ... 
    ">=" ... 
    "ge" ... 
    "<=" ... 
    "le" ... 
    "==" ... 
    "eq" ... 
    "!=" ... 
    "ne" ... 
    "&&" ... 
    "and" ... 
    "||" ... 
    "or" ... 
    "*" ... 
    "+" ... 
    "-" ... 
    "/" ... 
    "div" ... 
    "%" ... 
    "mod" ... 

    at org.apache.el.parser.ELParser.generateParseException(ELParser.java:2142) 
    at org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:2024) 
    at org.apache.el.parser.ELParser.DeferredExpression(ELParser.java:113) 
    at org.apache.el.parser.ELParser.CompositeExpression(ELParser.java:40) 
    at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:93) 
    ... 64 more 
+1

Ce problème n'est pas spécifique à JSF 2. C'est JSP-EL 2.2 spécifique. – BalusC

Répondre

8

Comme je l'ai mentionné dans un commentaire, cela peut être résolu en améliorant la mise en œuvre EL (par exemple le remplacement de jasper-el.jar avec el-impl-2.2.jar)

+0

A travaillé pour moi, merci! – waxwing

25

Comme mentionné dans d'autres réponses, vous devez ajouter le fichier el-api-2.2.jar au dossier lib de votre serveur Tomcat, et le fichier el-impl-2.2.jar à votre dossier WEB-INF/lib.

D'autres réponses mentionnent la suppression de jasper ou la création d'implémentations personnalisées d'ExpressionFactoryImpl. Cela pourrait fonctionner, mais vous ne devriez pas avoir besoin de faire cela.

Vous avez juste besoin de surcharger l'implémentation d'expression d'usine en utilisant org.apache.myfaces.EXPRESSION_FACTORY sur MyFaces ou com.sun.faces.expressionFactory sur Mojarra.

<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
</context-param> 
    <context-param> 
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
    </context-param> 
+0

Merci. J'ai essayé pendant deux jours avec toutes les solutions qui circulent sur le web et c'est la seule qui marche. – ali

+0

Il ne semble pas logique de conseiller un binaire -api pour aller sur un chemin côté serveur. -api signifie généralement qu'il s'agit d'une spécification, et est requis uniquement à la compilation (ce qui peut être fait avec une portée "fournie" dans maven.) De plus, si vous fournissez votre propre implémentation, je vous suggère de le mettre dans votre projet maven Je laisse délibérément le problème des conflits possibles avec les librairies côté serveur ... Il est évident que si une implémentation est déjà fournie dans votre distribution tomcat, il y aura des conflits ici – YoYo

+1

Tomcat avait déjà un api dans son chemin, mais il était une version très ancienne et il voulait utiliser une version plus récente.A ce stade en 2015, bien sûr, il serait plus logique de mettre à jour Tomcat, mais quand cette question a été posée à l'origine, et le contexte dans lequel passer à autre chose (comme Glassfish, qui travaillait pour lui) n'était pas une option, le remplacement de l'archaïque el-api était la seule vraie option. –

1

Remplacement el-api.jar et el-impl.jar avec el-api-2.2.jar et el-impl-2.2.jar résoudre le problème.

Aussi, vous devez ajouter dans votre context.xml le paramètre de contexte

<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
</context-param> 
    <context-param> 
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
    </context-param> 
1

Vous pouvez utiliser JBoss EL.

Il s'agit d'une implémentation d'Expression Language 2.1. Mais il a des extensions pour permettre les paramètres de méthode comme dans votre exemple:

<h:commandButton action="#{myBean.myAction(myParameter)}"/> 

L'avantage est que vous suffit de changer votre webapp et non lib de Tomcat.

Instructions

  1. Télécharger the latest version of Seam 2
  2. Extrait lib/jboss-el.jar
  3. copie à WEB-INF/lib/jboss-el.jar
  4. Dans votre web.xml ensemble:

    <context-param> 
        <param-name>com.sun.faces.expressionFactory</param-name> 
        <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
    </context-param> 
    

Voir aussi Invoke direct methods or methods with parameters in EL.

Questions connexes