【问题标题】:Websphere fails on using reserved words in ELWebsphere 在 EL 中使用保留字失败
【发布时间】:2012-07-05 21:24:45
【问题描述】:

我有一个 JSF1.2 应用程序,可以很好地部署在 Tomcat6 和 Tomcat7 上。 到目前为止一切顺利。

其中一个页面在 h:inputText 上包含以下属性:

 disabled="#{quoteFinance.quoteSaved or quoteRequest.quoteDisabled or setting.protected}"

这在上述 Tomcat 服务器上验证并正常工作。 但是,websphere8 认为这是一个问题并抛出以下错误:

 disabled="#{quoteFinance.quoteSaved or quoteRequest.quoteDisabled or setting.protected}" [protected] is not a valid Java identifier
at com.sun.facelets.tag.TagAttribute.getValueExpression(TagAttribute.java:259)
at com.sun.facelets.tag.jsf.ComponentRule$ValueExpressionMetadata.applyMetadata(ComponentRule.java:69)
at com.sun.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:36)
at com.sun.facelets.tag.MetaTagHandler.setAttributes(MetaTagHandler.java:76)

Cause:
javax.el.ELException: [protected] is not a valid Java identifier
at org.apache.el.parser.AstDotSuffix.setImage(AstDotSuffix.java:45)
at org.apache.el.parser.ELParser.DotSuffix(ELParser.java:1067)
at org.apache.el.parser.ELParser.ValueSuffix(ELParser.java:1033)
at org.apache.el.parser.ELParser.Value(ELParser.java:978)
at org.apache.el.parser.ELParser.Unary(ELParser.java:948)
at org.apache.el.parser.ELParser.Multiplication(ELParser.java:712)
at org.apache.el.parser.ELParser.Math(ELParser.java:632)
at org.apache.el.parser.ELParser.Compare(ELParser.java:444)
at org.apache.el.parser.ELParser.Equality(ELParser.java:338)
at org.apache.el.parser.ELParser.And(ELParser.java:282)

#{msg.continue} 有类似的问题,这很好,但因为 continue 是保留字,WAS8 会抛出错误。

  • 为什么 websphere 在代码正常运行时不接受这一点?
  • 我该如何解决这个问题?

非常感谢!

【问题讨论】:

  • 这个link 可能会有所帮助。看起来异常是在以下调用f.createValueExpression(ctx,this.value, type) 中引发的。其中f 是Websphere 上的ExpressionFactory 实现。

标签: jsf websphere el jsf-1.2 websphere-8


【解决方案1】:

“protected”也是一个java保留字!就像“继续”一样

【讨论】:

  • 我知道。我只是想知道为什么这些语句在 Tomcat、WAS6、WAS7 中有效,而在 WAS8 中不再有效
【解决方案2】:

来自Expression Language 2.2 规范:

标识符被限制为 Java 标识符 - 例如,没有 -、没有 / 等。

protected 不能用作 Java 中的标识符,因为它是保留的。

此限制也适用于 EL 2.1,因此它可能是旧平台的 EL 解析器中的一个错误,它曾经有效。

【讨论】:

    【解决方案3】:

    此行为符合EL specification。您需要将属性名称重命名为不是 Java 文字的名称,或者您需要使用大括号表示法,以便可以将其引用为 String

    #{setting['protected']}
    

    #{msg['continue']}
    

    这在 Tomcat 7 中也应该失败,也许您使用的是相当旧的 Tomcat 7 版本。这已在 7.0.0 和 7.0.10 之间的某个地方“修复”。目前已经是 7.0.28。

    【讨论】:

    • 我会在复工时回来查看。明天更新版本;)
    • 已确认。这些表达式在 Tomcat 6.0.32 中是允许的,但在 Tomcat 7.0.24 中会引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    相关资源
    最近更新 更多