2010-02-25 15 views
17

Z JSF 2, powinny być w stanie to zrobić:Korzystanie EL 2.2 z Tomcat 6.0.24

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

które następnie wywołać metodę działania, przekazując w parametrze (zakładamy, że jest to Integer):

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

To działa na Glassfish v3 idealnie. Jednak nie na Tomcat, masz informacją ELException błędu parsowania

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

Teraz istnieje implementacja documented way of making this work using EL 2.2 i GlassFish poprzez zastąpienie el-api jar w katalogu lib Tomcat, jednak wciąż otrzymuję ten sam błąd występujący bez szczęście. Tomcat naprawdę zaczyna mnie denerwować! JSF2 ma być łatwiejszy!

Maven POM fragmenty:

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

więcej informacji.

Oto część śladu stosu, wygląda na to, że wciąż używa implementacji Apache EL, a nie tej, którą wrzuciłem do biblioteki. Całkowicie usunąłem istniejący el-api.jar dostarczony z Tomcat, czy jest tam też jakieś miejsce, które może coś nadpisać?

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

Ten problem nie jest specyficzny dla JSF 2. Jest to specyfikacja JSP-EL 2.2. – BalusC

Odpowiedz

8

Jak wspomniałem w komentarzu, to może być rozwiązany poprzez modernizację realizację EL (tj zastępując jaspis-el.jar z el-IMPL-2.2.jar)

+0

Pracowałem dla mnie, dzięki! – waxwing

25

jak wspomniano w innych odpowiedzi, musisz dodać plik el-api-2.2.jar do folderu lib serwera serwera Tomcat, a plik el-impl-2.2.jar do folderu WEB-INF/lib.

Inne odpowiedzi wspominają o usuwaniu jaspisów lub tworzeniu niestandardowych implementacji ExpressionFactoryImpl. To może zadziałać, ale nie powinieneś tego robić.

Wystarczy zastąpić implementację fabryki ekspresów za pomocą org.apache.myfaces.EXPRESSION_FACTORY na MyFaces lub com.sun.faces.expressionFactory na 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

Dzięki. Przez dwa dni próbowałem korzystać ze wszystkich rozwiązań w Internecie i to jest jedyne, które działa. – ali

+0

Nie wydaje się rozsądne doradzanie, aby słoik -api działał na ścieżce po stronie serwera. -api zazwyczaj oznacza, że ​​jest to specyfikacja i jest wymagana tylko w trybie kompilacji (co można zrobić z "dostarczonym" zakresem w narzędziu.) Jeśli podasz własną implementację, sugerowałbym po prostu umieszczenie tego w twoim maven projekcie z obszarem "runtime" celowo pozostawiam kwestię ewentualnych konfliktów z bibliotekami po stronie serwera ... Jest oczywiste, że implementacja jest już dostarczona w twojej dystrybucji tomcat, będziemy mieć tu konflikty – YoYo

+1

Tomcat już miał pewne powody. api na swojej drodze, ale była to bardzo stara wersja i chciał użyć nowszej wersji. Oczywiście w tym momencie w przyszłości lepiej byłoby zaktualizować Tomcat, ale kiedy to pytanie zostało pierwotnie zadane, kontekst, w którym przejście na coś innego (np. Glassfish, który pracował dla niego) nie wchodziło w grę, zastąpienie archaicznego el-api było jedyną realną opcją. –

1

Wymiana el-api.jar i El-impl.jar EL-api 2.2.jar i El-IMPL-2.2.jar rozwiązać ten problem.

Ponadto trzeba dodać w swoim context.xml parametru context

<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

Można użyć JBoss EL.

Jest to implementacja języka Expression 2.1. Ale ma rozszerzenia umożliwiające parametry metody jak w przykładzie:

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

Zaletą jest to, że trzeba tylko zmienić webapp i nie LIB Tomcat.

Instrukcje

  1. Pobierz the latest version of Seam 2
  2. Wyciąg lib/jboss-el.jar
  3. Skopiuj go do WEB-INF/lib/jboss-el.jar
  4. w zestawie web.xml:

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

Zobacz także Invoke direct methods or methods with parameters in EL.