我的代码中有这行代码有问题:
rendered="#{myCartController.cartView == 'RETAIL_PRICE_GROSS' and fn:endsWith(myCartController.class.name,'.CartController')}"
它在Tomcat 6上没有问题,但在Tomcat 7上,它抛出以下异常:
Caused by: javax.el.ELException: Failed to parse the expression [#{myCartController.cartView == 'RETAIL_PRICE_GROSS' and fn:endsWith(myCartController.class.name,'.CartController')}]
at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:146)
at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:172)
at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:217)
at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:67)
at com.sun.facelets.tag.TagAttribute.getValueExpression(TagAttribute.java:256)
... 93 more
Tomcat 6和7之间的EL语法有什么变化吗?
答案 0 :(得分:4)
罪魁祸首在这里:
fn:endsWith(myCartController.class.name,'.CartController')
自Tomcat 7.0.4起,不再允许使用new
,instanceof
,class
,public
等Java语言标识符作为EL变量/函数名称。这是EL 2.2规范第1.19章中的错误修正的结果。
您需要在括号表示法中将它们指定为纯字符串:
fn:endsWith(myCartController['class'].name,'.CartController')
无关,使用Class#getSimpleName()
代替Class#getName()
可以改善特定表达式:
myCartController['class'].simpleName == 'CartController'