2010-02-25 13 views
17

Con JSF 2 que debe ser capaz de hacer esto:EL 2.2 con Tomcat 6.0.24

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

que luego llamar al método de acción, que pasa en el parámetro (asumir que es un entero):

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

Esto funciona perfectamente en Glassfish v3. Sin embargo, no en Tomcat, se obtiene un notifica ELException del error de análisis

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

Ahora, hay una aplicación documented way of making this work using EL 2.2 y de Glassfish mediante la sustitución de la jarra el-api en el directorio lib de Tomcat, sin embargo sigo teniendo el mismo error que se produce sin suerte. ¡Tomcat realmente está empezando a frustrarme! ¡JSF2 está destinado a ser más fácil!

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

Más info.

Aquí está parte del seguimiento de la pila, parece que todavía está usando una implementación Apache EL, y no la que descargué en lib. Eliminé completamente el el-api.jar existente que venía con Tomcat, ¿hay un el-impl.jar que estoy destinado a eliminar en algún lugar que puede estar anulando algo?

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

Este problema no es específico de JSF 2. Es JSP-EL 2.2 específico. – BalusC

Respuesta

8

Como ya he mencionado en un comentario, esto puede ser resuelto mediante la mejora de la ejecución EL (es decir, la sustitución de Jasper-el.jar con el-impl-2.2.jar)

+0

¡Trabajó para mí, gracias! – waxwing

25

Como se ha mencionado en otras respuestas, necesita agregar el-api-2.2.jar a la carpeta lib de su servidor Tomcat, y el-impl-2.2.jar a su carpeta WEB-INF/lib.

Otras respuestas mencionan la eliminación de jasper o la creación de implementaciones personalizadas de ExpressionFactoryImpl. Eso podría funcionar, pero no debería necesitar hacer eso.

Solo tiene que anular la implementación de expresión de fábrica utilizando org.apache.myfaces.EXPRESSION_FACTORY en MyFaces o com.sun.faces.expressionFactory en 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

Gracias. Intenté durante dos días con todas las soluciones volando por la web y esta es la única que funciona. – ali

+0

No parece de sentido común recomendar que un jar -api vaya en una ruta del lado del servidor. -api normalmente significa que se trata de una especificación, y solo se requiere tiempo de compilación (lo que se puede hacer con un alcance "provisto" en maven. Además, si proporciona su propia implementación, le sugiero que solo incluya esto en su proyecto de maven con el ámbito de "tiempo de ejecución". Dejo deliberadamente el tema de posibles conflictos con las bibliotecas del servidor abiertas ... Es obvio si ya se ha proporcionado una implementación en su distribución de tomcat, tendremos conflictos aquí. – YoYo

+1

Tomcat ya tenía un api en su camino, pero era una versión extremadamente antigua y quería usar una versión más nueva. En este punto en 2015, por supuesto, tendría más sentido actualizar solo Tomcat, pero cuando esta pregunta fue formulada originalmente, y en el contexto que cambiar a otra cosa (como Glassfish, que funcionó para él) no era una opción, reemplazar la el-api arcaica era la única opción real. –

1

Reemplazar el-el-api.jar y impl.jar con el-api-2.2.jar y el-impl-2.2.jar resolver el problema.

También hay que añadir en su context.xml el parámetro de contexto

<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

Puede utilizar JBoss EL.

Es una implementación de Expression Language 2.1. Pero tiene extensiones para permitir que los parámetros del método como en el ejemplo:

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

La ventaja es que sólo tiene que cambiar su aplicación web y no lib de Tomcat.

Instrucciones

  1. Descarga the latest version of Seam 2
  2. Extraer lib/jboss-el.jar
  3. copiarlo en WEB-INF/lib/jboss-el.jar
  4. En su conjunto web.xml:

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

Véase también Invoke direct methods or methods with parameters in EL.

Cuestiones relacionadas