2010-02-25 10 views
17

Mit JSF 2 Sie sollten in der Lage, dies zu tun:Mit EL 2.2 mit Tomcat 6.0.24

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

, die dann die Aktionsmethode nennen würde, in dem Parameter übergeben (nehme an, es ist ein Integer):

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

Dies funktioniert auf Glassfish v3 perfekt. Allerdings nicht auf Tomcat, erhalten Sie einen ELException anmelde des Parse-Fehler erhalten

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

Jetzt gibt es eine documented way of making this work using EL 2.2 und Umsetzung des Glassfish durch den el-api jar im Tomcat lib ersetzt, aber noch ich den gleichen Fehler mit nicht auftreten Glück. Tomcat fängt wirklich an, mich zu frustrieren! JSF2 soll einfacher sein!

Maven POM Fragmente:

<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> 

Mehr Info.

Hier ist ein Teil der Stack-Trace, scheint es immer noch eine Apache EL-Implementierung, und nicht die, die ich in lib abgeladen. Ich habe die bestehende el-api.jar komplett entfernt, die mit Tomcat kam, gibt es eine el-impl.jar Ich soll irgendwo auch etwas entfernen, das etwas überschreiben könnte?

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

Dieses Problem ist nicht spezifisch für JSF 2. Es ist JSP-EL 2.2 spezifisch. – BalusC

Antwort

8

Wie ich in einem Kommentar erwähnt, kann dies durch ein Upgrade der EL-Implementierung gelöst wird

+0

Arbeitete für mich, danke! – waxwing

25

Wie erwähnt in anderen Antworten (dh Jaspis-el.jar mit el-impl-2.2.jar ersetzt), Sie müssen die Datei el-api-2.2.jar zum lib-Ordner Ihres Tomcat-Servers und die Datei el-impl-2.2.jar zum Ordner WEB-INF/lib hinzufügen.

Andere Antworten erwähnen das Löschen von Jaspis oder das Erstellen von benutzerdefinierten Implementierungen von ExpressionFactoryImpl. Das könnte funktionieren, aber das sollte nicht nötig sein.

Sie müssen nur die Expression-Factory-Implementierung mit org.apache.myfaces.EXPRESSION_FACTORY auf MyFaces oder com.sun.faces.expressionFactory auf Mojarra überschreiben.

<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

Danke. Ich habe versucht, zwei Tage lang mit all den Lösungen im Internet zu fliegen und das ist die einzige, die funktioniert. – ali

+0

Es scheint nicht sinnvoll, für ein -api jar auf einen serverseitigen Pfad zu gehen. -api bedeutet in der Regel, dass dies eine Spezifikation ist und nur zur Kompilierzeit benötigt wird (was mit einem "bereitgestellten" Bereich in Maven möglich ist. Wenn Sie Ihre eigene Implementierung bereitstellen, würde ich vorschlagen, dies einfach in Ihr Maven-Projekt einzufügen mit dem "runtime" scope. Ich lasse absichtlich das Problem möglicher Konflikte mit serverseitigen Bibliotheken offen ... Es ist offensichtlich, wenn eine Implementierung bereits in deiner tomcat-Distribution enthalten ist, werden wir hier Konflikte haben. – YoYo

+1

Tomcat hatte bereits einen el api in seinem Weg, aber es war eine extrem alte Version und er wollte eine neuere Version verwenden. An diesem Punkt im Jahr 2015 wäre es natürlich sinnvoller, nur Tomcat zu aktualisieren, aber wenn diese Frage ursprünglich gestellt wurde, und in Der Kontext, dass der Wechsel zu etwas anderem (wie Glassfish, das für ihn arbeitete) keine Option war, war die einzige echte Option, die archaische el-api zu ersetzen. –

1

Ersetzen el-api.jar und el-impl.jar mit el-api-2.2.jar und el-impl-2.2.jar das Problem lösen.

Darüber hinaus müssen Sie in Ihrem context.xml der Kontextparameter

<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

Sie verwenden JBoss EL hinzuzufügen.

Es ist eine Implementierung von Expression Language 2.1. Aber es hat Erweiterungen Methodenparameter wie in Ihrem Beispiel zu ermöglichen:

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

Der Vorteil ist, dass Sie nur Ihre Webapp ändern müssen und nicht die Tomcat-lib.

Anleitung

  1. Herunterladen the latest version of Seam 2
  2. Extract lib/jboss-el.jar
  3. Kopieren Sie es in WEB-INF/lib/jboss-el.jar
  4. In Ihrem web.xml Set:

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

Siehe auch Invoke direct methods or methods with parameters in EL.