javax.el.E​​LException:无法解析表达式[{pz:instanceof(object,'com.project.domain.MyClass')}]

时间:2011-10-23 14:39:21

标签: jsf facelets el tomcat7

Currenty我有一个在tomcat 6.0.18.0中运行JSF 1.2和Facelets的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,如果我用tomcat 6.0.18替换jasper.jar和jasper-el.jar,那么每个标记都可以正常工作。

在升级tomcat之前有没有其他人遇到此问题?他们是如何解决的? 我可以使用tomcat 6中的这些jasper jar在生产tomcat 7中进行部署,否则会导致更多问题。

4 个答案:

答案 0 :(得分:17)

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

EL 2.2 specification说明如下:

  

1.14保留字

     

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

    and   eq     gt     true   instanceof
    or    ne     le     false  empty
    not   lt     ge     null   div        mod
     

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

  

1.19收集的语法

     

...

Identifier ::= Java language identifier
     

...

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

这已在Tomcat 7.0.4或此版本之前的某处修复,如issue 50147所示,其他人指出了与您相同的问题。因此,要解决您的问题,您必须将EL函数名称重命名为例如#{bean.class.simpleName}或其他内容。

答案 1 :(得分:8)

在catalina.properties([tomcat folder] / conf)中添加此行,它应该可以解决问题。

org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true

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

答案 2 :(得分:5)

您也可以尝试更改语法。当我们从Tomcat 6移动到7时,我遇到了与我维护的代码完全相同的问题。我必须将myobject.class.name更改为myobject['class'].name。在我做了这个改变后,我的代码再次完美地运行了。

答案 3 :(得分:2)

确实很有暗示!我必须使用$ {instance ['class']更改我的jspx $ {instance.class.simpleName == ...}。simpleName eq ...}。

我从tomcat 6上的vFabric移动到tomcat 7上的vFabric