3

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

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

4

1 回答 1

4

罪魁祸首在这里:

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

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

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

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

也可以看看:


与具体问题无关Class#getSimpleName(),可以通过使用代替来改进特定表达式如下Class#getName()

myCartController['class'].simpleName == 'CartController'
于 2013-10-01T13:02:19.313 回答