Korzystanie z EL 2.2 z Tomcat 6.0.24

Z JSF 2 powinieneś być w stanie to zrobić:

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

Który następnie wywoła metodę akcji, przekazując parametr (Załóżmy, że jest liczbą całkowitą):

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

To działa na Glassfish v3 doskonale. Jednak nie w Tomcat, otrzymasz ELException powiadamiający o błędzie parse

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

Teraz jest udokumentowany sposób wykonania tej pracy przy użyciu el 2.2 i implementacji Glassfish poprzez zastąpienie el-api jar w katalogu Tomcat lib, jednak nadal dostaję ten sam błąd występujący bez powodzenia. Tomcat naprawdę zaczyna mnie frustrować! JSF2 ma być łatwiejsze!

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>

Więcej informacji.

Oto część śledzenia stosu, wygląda na to, że nadal używa implementacji Apache EL, a nie tej, którą wrzuciłem do lib. Całkowicie usunąłem istniejący el-api.jar, który przyszedł z Tomcat, czy jest el-impl.jar mam usunąć gdzieś też, że może być coś nadrzędnego?

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
Author: Sampson, 2010-02-25

4 answers

Jak wspomniano w innych odpowiedziach, musisz dodać el-api-2.2.jar do folderu lib serwera Tomcat oraz el-impl-2.2.jar do folderu WEB-INF / lib.

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

Wystarczy nadpisać implementację expression factory używając org.Apacz.moje twarze.EXPRESSION_FACTORY na MyFaces lub com.słońce.twarze.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>
 25
Author: Lawrence McAlpin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-27 21:43:18

Jak wspomniałem w komentarzu, można to rozwiązać poprzez uaktualnienie implementacji EL (tj. zastąpienie jasper-el.słoik z el-impl-2.2.jar)

 8
Author: jamiebarrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 12:32:21

Zastępowanie el-api.jar i el-impl.jar z el-api-2.2.jar i el-impl-2.2.jar rozwiązuje problem.

Również musisz dodać w swoim kontekście.xml parametr kontekstowy

<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
Author: Neos76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 12:36:34

Możesz użyć JBoss EL.

Jest implementacją języka wyrażeń 2.1. Ale ma rozszerzenia, aby umożliwić parametry metody, jak w twoim przykładzie:

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

Zaletą jest to, że musisz tylko zmienić webapp, a nie Katalog lib Tomcat.

Instrukcje

  1. Pobierz najnowszą wersję Seam 2
  2. ekstrakt lib/jboss-el.jar
  3. Skopiuj do WEB-INF/lib/jboss-el.jar
  4. W Twoim web.xml "set": {]}

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

Patrz również wywoływanie metod bezpośrednich lub metod z parametrami w EL .

 1
Author: Arend v. Reinersdorff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:11