【问题标题】:javax.el.ELException: Failed to parse the expression [{pz:instanceof(object,'com.project.domain.MyClass')}]javax.el.E​​LException:无法解析表达式 [{pz:instanceof(object,'com.project.domain.MyClass')}]
【发布时间】:2011-10-23 14:39:21
【问题描述】:

目前我有一个使用 JSF 1.2 和 Facelets 在 tomcat 6.0.18.0 中运行的 Web 项目。我决定升级 servlet 容器,因此我部署在 tomcat 7 中,一切似乎都很好,直到我们使用我的自定义 facelet 函数点击一个视图。

javax.el.ELException: Failed to parse the expression [{pz:instanceof(object,'com.project.domain.MyClass')}]

Caused by: org.apache.el.parser.ParseException: Encountered " ":" ": "" at line 1, column 5. Was expecting one of:
"}" ...
"." ...
"[" ...

解析以下代码时出现此错误:

<ui:repeat var="object" value="#{objects}">
<ui:fragment rendered="#{pz:instanceof(object,'com.project.domain.MyClass')}">
...

如果我理解正确,它会因为表达式中的冒号而引发错误。我已经将它追踪到了 tomcat/lib 目录中附带的 jasper-el,如果我将 jasper.jar 和 jasper-el.jar 替换为来自 tomcat 6.0.18 的那些,一切都很好。

在升级他们的tomcat之前有没有其他人遇到过这个问题?他们是如何解决的? 我可以使用这些来自 tomcat 6 的 jasper jar 在生产 tomcat 7 中部署吗,或者这会导致进一步的问题。

【问题讨论】:

    标签: jsf facelets el tomcat7


    【解决方案1】:

    这实际上是一个误导性的例外。它有不同的根本原因。函数名instanceof无效。

    EL 2.2 specification 表示如下:

    1.14 保留字

    以下单词是为语言保留的,不得用作 标识符。

    和 eq gt true instanceof 或 ne le false 空 不是 ge null div mod

    请注意,其中许多词现在不在该语言中,但它们可能在 未来,因此开发人员必须避免使用这些词。

    1.19 集合语法

    ...

    Identifier ::= Java language identifier
    

    ...

    Java 语言标识符代表instanceofifwhileclassreturnstaticnew 等关键字。它们不能用作变量/ EL 中的函数名称。如果您有具有这些名称的属性,请使用大括号表示法,例如 #{bean['class'].simpleName} 而不是 #{bean.class.simpleName}

    这已在 Tomcat 7.0.4 或此版本之前的某个地方得到修复,如 issue 50147 所示,其中其他人指出了与您相同的问题。因此,要解决您的问题,您必须将您的 EL 函数名称重命名为例如 isInstanceOf 或其他名称。

    【讨论】:

    • 这将教会我不要用保留字命名函数,小错误消息也没有列出这些,它可以让我省去很多麻烦。再次感谢 BalusC。
    【解决方案2】:

    在 catalina.properties ([tomcat 文件夹]/conf) 中添加这一行,它应该可以解决问题。

    org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
    

    但是,您不应该使用保留字。

    【讨论】:

    • 谢谢阿德里安,我也这样做了。事实上,如果我没记错的话,这是我所做的第一个更改之一,但是如果您仍然有一个类似于保留字的函数,例如“instanceof”,它仍然会引发错误。
    【解决方案3】:

    您也可以尝试更改语法。当我们从 Tomcat 6 迁移到 7 时,我在维护的代码中遇到了同样的问题。我不得不将 myobject.class.name 更改为 myobject['class'].name。进行此更改后,我的代码再次完美运行。

    【讨论】:

    • 纯金,那个回应。谢谢!它也适用于从 Jetty 7 迁移到 Tomcat 7。
    【解决方案4】:

    很好的提示,确实!我不得不用 ${instance['class'].simpleName eq ...} 更改我的 jspx ${instance.class.simpleName == ...}。

    我正在从 tomcat 6 上的 vFabric 迁移到 tomcat 7 上的 vFabric

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2015-04-16
      • 2012-02-16
      • 2015-07-11
      相关资源
      最近更新 更多