2010-02-25 5 views
17

С JSF 2 вы должны быть в состоянии сделать это:Использование EL 2.2 с Tomcat 6.0.24

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

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

@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: ... 

Теперь есть documented way of making this work using EL 2.2 и реализация GlassFish путем замены 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 
+1

Эта проблема не специфична для JSF 2. Это JSP-EL 2.2. – BalusC

ответ

8

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

+0

Работал для меня, спасибо! – waxwing

25

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

В других ответах упоминается удаление яшмы или создание пользовательских реализаций 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> 
+0

Спасибо. Я пробовал в течение двух дней со всеми решениями, которые летают в Интернете, и это единственное, что работает. – ali

+0

Не кажется здравым смыслом советовать, чтобы -api jar пошел по серверному пути. -api обычно означает, что это спецификация и требуется только время компиляции (что может быть сделано с помощью «предоставленной» области в maven. Кроме того, если вы предоставите свою собственную реализацию, я бы предложил просто поместить это в ваш проект maven с областью «runtime». Я намеренно оставляю проблему возможных конфликтов с библиотеками на стороне сервера открытыми ... Очевидно, если реализация уже включена в ваш дистрибутив tomcat, у нас будут конфликты здесь. – YoYo

+1

Tomcat уже имел el- api на своем пути, но это была очень старая версия, и он хотел использовать более новую версию. На данный момент в 2015 году, конечно, было бы разумнее просто обновить Tomcat, но когда этот вопрос был первоначально задан и в контекст, который переключился на что-то другое (например, Glassfish, который работал на него), не был вариантом, заменив архаичный el-api, был единственным реальным вариантом. –

1

Замена эль-api.jar и эль-impl.jar с эль-Апи-2.2.jar и Эль-осущ-2.2.jar решить эту проблему.

Кроме того, необходимо добавить в ваш context.xml параметр контекста

<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

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

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

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

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

Инструкции

  1. Скачать the latest version of 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> 
    

См. Также Invoke direct methods or methods with parameters in EL.

Смежные вопросы