jsf - org.apache.el.parser.ParseException : Encountered "(" at line X, 列 Y. 期待 [...]

标签 jsf el parentheses parseexception methodexpression

下面的 JSF 片段:

<p:dataTable value="#{userbean.getAll()}" var="user">

抛出这个异常:
Encountered "(" at line 1, column 18. Was expecting one of: "}" ... "." ... "[" ... ">" ... "gt" ... "<" ... "lt" ... ">=" ... "ge" ... "<=" ... "le" ... "==" ... "eq" ... "!=" ... "ne" ... "&&" ... "and" ... "||" ... "or" ... "*" ... "+" ... "-" ... "/" ... "div" ... "%" ... "mod" ... 
org.apache.el.parser.ParseException: Encountered "(" at line 1, column 18. 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)
    at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:150)
    at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:194)
    at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:68)
    at com.sun.faces.facelets.el.ELText$ELTextVariable.apply(ELText.java:203)
    at com.sun.faces.facelets.compiler.AttributeInstruction.apply(AttributeInstruction.java:101)
    at com.sun.faces.facelets.compiler.UIInstructionHandler.apply(UIInstructionHandler.java:141)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
    at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:196)
    at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
    at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98)

这是怎么引起的,我该如何解决?

最佳答案

如果您的环境不支持 EL 2.2,就会发生这种情况。使用这样的括号/参数调用直接方法

value="#{userbean.getAll()}" 
仅从 EL 2.2 开始支持,它与 Servlet 3.0 齐头并进。如果您遇到此异常,则只能表示您没有部署到 Servlet 3.0 兼容容器,或者您的 web 应用程序的 web.xml未声明符合 Servlet 3.0,或者您的 web 应用程序的 /WEB-INF/lib到处都是随意下载的特定于 servletcontainer 的 JAR 文件,这些 JAR 文件源自完全不同的 servletcontainer make/version,不符合 EL 2.2。
基本上有2种解决方案:
  • 使用 EL 2.1 兼容语法,这适用于 Servlet 2.5 兼容容器:
     value="#{userbean.all}" 
    
  • 升级到 Servlet 3.0 兼容容器(Tomcat 7、Glassfish 3、JBoss AS 6 等),或修复您的 web.xml遵守 Servlet 3.0。

  • 您还应该绝对确保您的 web 应用程序的 /WEB-INF/lib不包含 任何 servletcontainer 特定的库,例如 el-api.jar和 friend (另见 this related question)。
    请注意,这根本不是 JSF 问题。您收到来自 javax.el 的异常/org.apache.el包裹,不是来自 javax.faces/com.sun.faces包裹。这意味着这是一个EL问题。这基本上是说你的 EL 语法是错误的。它遇到了 (它没想到的地方。此后清楚地列出了预期的字符/运算符。
    也可以看看:
  • Invoke direct methods or methods with arguments / variables / parameters in EL
  • How to call a method with a parameter in JSF
  • Our EL wiki page
  • 关于jsf - org.apache.el.parser.ParseException : Encountered "(" at line X, 列 Y. 期待 [...],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17836525/

    相关文章:

    bash 函数 : enclosing the body in braces vs. 括号

    javascript - 如何停止 JSF 重新加载页面 "onclick"?

    java - 迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败

    jsf - bean 和 jsf 验证注释 inisde 托管 bean 与实体 bean

    java - jsp el中点运算符和括号之间的区别

    java - EL 方法中的参数

    sql - 为什么在SQL查询中添加括号会导致结果更改?

    python - For循环在解析中返回相同的字符

    mysql - 验证 JSF 实体中的持久日期

    java - 密码检查成功后加载新网页