Использование EL 2.2 с Tomcat 6.0.24 - PullRequest
17 голосов
/ 25 февраля 2010

С JSF 2 вы сможете сделать это:

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

, который затем вызвал бы метод действия, передавая параметр (предположим, что это целое число):

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

Отлично работает на Glassfish v3. Однако не в Tomcat вы получаете сообщение ELException, уведомляющее об ошибке разбора

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

Теперь есть документированный способ выполнения этой работы с использованием EL 2.2 и реализации Glassfish путем замены jar el-api в директории lib Tomcat, однако я все еще получаю ту же ошибку, но безуспешно. Tomcat действительно начинает расстраивать меня! JSF2 должен быть проще!

фрагменты 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>

Подробнее.

Вот часть трассировки стека, кажется, она все еще использует реализацию Apache EL, а не ту, которую я сбросил в lib. Я полностью удалил существующий el-api.jar, поставляемый с Tomcat, есть ли el-impl.jar, который я тоже должен удалить где-то, что может переопределить что-то?

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

Ответы [ 4 ]

25 голосов
/ 28 сентября 2010

Как уже упоминалось в других ответах, вам нужно добавить el-api-2.2.jar в папку lib вашего сервера Tomcat, а el-impl-2.2.jar - в папку WEB-INF / lib.

В других ответах упоминается удаление jasper или создание пользовательских реализаций ExpressionFactoryImpl. Это может сработать, но вам не нужно этого делать.

Вам просто нужно переопределить реализацию фабрики выражений, используя org.apache.myfaces.EXPRESSION_FACTORY в MyFaces или com.sun.faces.expressionFactory в 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>
8 голосов
/ 01 марта 2010

Как я уже упоминал в комментарии, это можно решить, обновив реализацию EL (т.е. заменив jasper-el.jar на el-impl-2.2.jar)

2 голосов
/ 21 ноября 2013

Вы можете использовать JBoss EL.

Это реализация языка выражений 2.1. Но у него есть расширения для разрешения параметров метода, как в вашем примере:

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

Преимущество заключается в том, что вам нужно только изменить свое веб-приложение, а не каталог lib Tomcat.

Инструкция

  1. Скачать последнюю версию Seam 2
  2. Извлечение lib/jboss-el.jar
  3. Скопируйте в WEB-INF/lib/jboss-el.jar
  4. В вашем web.xml наборе:

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

См. Также Вызывать прямые методы или методы с параметрами в EL .

1 голос
/ 04 апреля 2011

Замена el-api.jar и el-impl.jar на el-api-2.2.jar и el-impl-2.2.jar решит проблему.

Также вам нужно добавить в ваш context.xml параметр 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>
...