无法解析表达式[#{myCartController.cartView =='RETAIL_PRICE_GROSS'和fn:endsWith(myCartController.class.name,'。CartController')}]

时间:2013-10-01 12:50:47

标签: jsf tomcat el

我的代码中有这行代码有问题:

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语法有什么变化吗?

1 个答案:

答案 0 :(得分:4)

罪魁祸首在这里:

fn:endsWith(myCartController.class.name,'.CartController')

自Tomcat 7.0.4起,不再允许使用newinstanceofclasspublic等Java语言标识符作为EL变量/函数名称。这是EL 2.2规范第1.19章中的错误修正的结果。

您需要在括号表示法中将它们指定为纯字符串:

fn:endsWith(myCartController['class'].name,'.CartController')

另见:


对具体问题

无关,使用Class#getSimpleName()代替Class#getName()可以改善特定表达式:

myCartController['class'].simpleName == 'CartController'