Jsf javax.el.ELException:未能分析表达式[{pz:instanceof(object,';com.project.domain.MyClass';)}]
目前我有一个web项目,JSF1.2和Facelets在Tomcat6.0.18.0中运行。我决定升级servlet容器,因此我在Tomcat7中进行了部署,在我们使用CustomeFacelet函数访问一个视图之前,一切似乎都正常Jsf javax.el.ELException:未能分析表达式[{pz:instanceof(object,';com.project.domain.MyClass';)}],jsf,facelets,el,tomcat7,Jsf,Facelets,El,Tomcat7,目前我有一个web项目,JSF1.2和Facelets在Tomcat6.0.18.0中运行。我决定升级servlet容器,因此我在Tomcat7中进行了部署,在我们使用CustomeFacelet函数访问一个视图之前,一切似乎都正常 javax.el.ELException:未能分析表达式[{pz:instanceof(object,'com.project.domain.MyClass')}] 分析以下代码时发生此错误: <ui:repeat var="object" value="#{
javax.el.ELException:未能分析表达式[{pz:instanceof(object,'com.project.domain.MyClass')}]
分析以下代码时发生此错误:
<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,或者这会导致进一步的问题。这实际上是一个误导性的例外。它有不同的根本原因。函数名
instanceof
无效
报告说:
1.14保留字
以下词语是为该语言保留的,不得用作
标识符
and eq gt true instanceof
or ne le false empty
not lt ge null div mod
Identifier ::= Java language identifier
其中Java语言标识符表示关键字,如instanceof
,if
,while
,class
,return
,static
,new
,等等。它们不能在EL中用作变量/函数名。如果您有具有这些名称的属性,请使用大括号表示法,如so{bean['class'].simpleName}
而不是{bean.class.simpleName}
这在Tomcat7.0.4中已经修复,或者在这个版本之前的某个地方,正如其他人指出的,与您的问题相同。因此,要解决您的问题,您必须将EL函数名重命名为例如
isInstanceOf
或其他名称。在catalina.properties([tomcat folder]/conf)中添加这一行,它应该可以解决问题
org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
但是,您不应该使用保留字。您也可以尝试更改语法。当我们从Tomcat6迁移到7时,我在维护代码时遇到了同样的问题。我必须将
myobject.class.name
更改为myobject['class'].name
。在我做了这个修改之后,我的代码又完美地工作了。非常好的提示,真的!我必须用${instance['class'].simpleName eq…}更改jspx${instance.class.simpleName===…}
我从tomcat 6上的vFabric迁移到tomcat 7上的vFabric,这将教会我不要用保留字命名函数,错误消息也没有列出这些,这可能会让我省去很多麻烦。再次感谢巴卢斯克,谢谢阿德里安,我也这么做了。事实上,如果我没记错的话,这是我做的第一个更改之一,但是如果你仍然有一个类似于保留字的函数,比如“instanceof”,它仍然会抛出一个错误。纯金,这个响应。谢谢!从Jetty 7移动到Tomcat 7也是适用的。
org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true