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中进行部署,否则会导致更多问题。
答案 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语言标识符代表instanceof
,if
,while
,class
,return
,static
,{{ 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