[英]javax.el.ELException: Failed to parse the expression [{pz:instanceof(object,'com.project.domain.MyClass')}]
當前,我有一個Web項目,其中包含在Tomcat 6.0.18.0中運行的JSF 1.2和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:
"}" ...
"." ...
"[" ...
解析以下代碼時,會發生此錯誤:
<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,thingthign效果很好。
升級tomcat之前,還有其他人遇到過這個問題嗎? 他們如何解決呢? 我可以使用來自tomcat 6的這些碧玉罐在生產tomcat 7中進行部署,還是可能引起更多問題。
這實際上是一個誤導性的例外。 它具有不同的根本原因。 函數名稱instanceof
無效。
EL 2.2規范指出:
1.14保留字
以下單詞是該語言的保留字,不得用作標識符。
\n 和eq gt true instanceof\n 或虛假為空\n 不是lt null div mod\n請注意,這些單詞中的許多現在都不是該語言,但是將來可能會出現,因此開發人員必須避免使用這些單詞。
和
1.19收集的語法
...
Identifier ::= Java language identifier
...
Java語言標識符代表諸如instanceof
, if
, while
, class
, return
, static
, new
等的關鍵字。在EL中,它們不能用作變量/函數名稱。 如果您擁有具有這些名稱的屬性,請改為使用大括號表示法,例如#{bean['class'].simpleName}
而不是#{bean.class.simpleName}
。
如問題50147所示,此問題已在Tomcat 7.0.4或此版本之前的某個位置修復,其中其他人指出的問題與您相同。 因此,要解決您的問題,您必須將EL函數名稱重命名為isInstanceOf
名稱。
在catalina.properties([tomcat文件夾] / conf)中添加此行,它應該可以解決此問題。
org.apache.el.parser.SKIP_IDENTIFIER_CHECK=true
但是,您不應使用保留字。
您也可以嘗試更改語法。 當我從Tomcat 6遷移到7時,我遇到了與代碼相同的確切問題。我不得不將myobject.class.name
更改為myobject['class'].name
。 進行此更改后,我的代碼再次正常運行。
確實是個很好的提示! 我必須用$ {instance ['class']。simpleName eq ...}更改jspx $ {instance.class.simpleName == ...}。
我從tomcat 6上的vFabric遷移到tomcat 7上的vFabric
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.