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

Gar*_*txo 7 jsf facelets el tomcat7

Currenty我有一个带有JSF 1.2的Web项目和在tomcat 6.0.18.0中运行的Facelets.我决定升级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:
"}" ...
"." ...
"[" ...
Run Code Online (Sandbox Code Playgroud)

解析以下代码时会发生此错误:

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

如果我理解正确,它会因为表达式中的冒号而引发错误.我已将它跟踪到tomcat/lib目录中的jasper-el,如果我用tomcat 6.0.18替换jasper.jar和jasper-el.jar,那么每个标记都可以正常工作.

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

Bal*_*usC 17

这实际上是一个误导性的例外.它有不同的根本原因.功能名称instanceof无效.

EL 2.2规范说以下内容:

1.14保留字

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

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

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

1.19收集的语法

...

Identifier ::= Java language identifier
Run Code Online (Sandbox Code Playgroud)

...

当Java语言标识代表类似的关键字instanceof,if,while,class,return,static,new,等他们可能不会被用作EL变量/函数名.如果你有这些名字属性,使用括号符号,而不是像这样#{bean['class'].simpleName}的代替#{bean.class.simpleName}.

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


Adr*_*sma 8

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

org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
Run Code Online (Sandbox Code Playgroud)

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


use*_*100 5

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