Utiliser EL 2.2 avec Tomcat 6.0.24

avec JSF 2 vous devriez être capable de faire ceci:

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

qui appellerait alors la méthode action, passant dans le paramètre (supposons que c'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 parse

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

maintenant, il y a un documentée façon de faire ce travail à l'aide de EL 2.2 et la mise en œuvre de Glassfish en remplaçant le el-api Jarre dans la lib Tomcat répertoire, cependant j'obtiens toujours la même erreur se produisant sans chance. Tomcat commence vraiment à me frustrer! JSF2 est censé être plus facile!

Maven POM fragments:

<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'info.

Voici une partie de la trace de la pile, il semble qu'elle utilise toujours une implémentation D'Apache EL, et pas celle que j'ai balancé dans lib. J'ai complètement supprimé de l'existant el-api.jar qui est venu avec Tomcat, y a-t-il un el-impl.jar je suis censé enlever quelque part aussi que peut-être quelque chose de primordial?

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
17
demandé sur Sampson 2010-02-25 14:31:27

4 réponses

Comme mentionné dans d'autres réponses, vous devez ajouter le el-api-2.2.jar vers le dossier lib de votre serveur Tomcat, et le 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. Ça pourrait marcher, mais tu ne devrais pas avoir besoin de faire ça.

Vous avez juste besoin de modifier l'expression mise en œuvre de l'usine en utilisant org.Apache.myfaces.EXPRESSION_FACTORY sur les MyFaces ou COM.soleil.face.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>
25
répondu Lawrence McAlpin 2010-09-27 21:43:18

comme je l'ai mentionné dans un commentaire, cela peut être résolu en améliorant la mise en œuvre de la le (c.-à-d. en remplaçant jasper-el.bocal avec el-impl-2.2.jar)

8
répondu jamiebarrow 2010-03-01 12:32:21

remplacement de l'api el.jar et El-impl.bocal avec EL-api-2.2.jar et El-impl-2.2.pot de résoudre le problème.

Vous devez aussi ajouter dans votre contexte.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
répondu Neos76 2011-04-04 12:36:34

vous pouvez utiliser JBoss EL.

C'est une implémentation du Langage d'Expression 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 n'avez qu'à changer votre webapp et pas le répertoire lib de Tomcat.

Instructions

  1. Télécharger la dernière version de Seam 2
  2. Extrait lib/jboss-el.jar
  3. Copie à WEB-INF/lib/jboss-el.jar
  4. Dans votre web.xml jeu:

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

Voir aussi Invoquer des méthodes directes ou des méthodes avec des paramètres dans EL.

1
répondu Arend v. Reinersdorff 2017-05-23 12:09:11