javax.el.PropertyNotFoundException 当属性名称的第二个字符是大写时

Posted

技术标签:

【中文标题】javax.el.PropertyNotFoundException 当属性名称的第二个字符是大写时【英文标题】:javax.el.PropertyNotFoundException when second character of property name is a capital 【发布时间】:2011-01-13 12:36:18 【问题描述】:

我遇到了这种不寻常的情况:

我有一个registrationVO,它的属性和getter setter很少。 例如citybCity 及其getter 方法getCity()getBCity()

在 JSP 中,我尝试使用 scriplets 显示这些属性的值, <%=registrationVO.getCity()%> 和 %=registrationVO.getBCity()%> ,它工作正常。 但是我用表达语言替换了相同的内容, $registrationVO.city$registrationVO.bCity 我收到一条错误消息,提示在 registrationVO 中找不到属性“bCity”。 我再次为 bCity 使用了 scriplet,我得到了输出。

我观察到这是因为命名约定。 “如果属性的第二个字符是大写字母,我们不能使用表达式语言”。我尝试了许多不同的命名,这就是我发现的。

请检查这个场景,我不知道我的结论是对还是错。

谢谢, DJ

【问题讨论】:

【参考方案1】:

如果 getter 方法的属性名称至少以两个大写字符开头,那么您还需要在 EL 属性名称中使用所有这些大写字符。在您的特定情况下,您需要将其替换为 $registrationVO.BCity。这在Javabeans spec 的第 8.8 章中有规定。这是本章的摘录(重点是我的):

8.8 推断名称的大写。

当我们使用设计模式来推断属性或事件名称时,我们需要确定哪些规则 跟随以大写推断的名称。如果我们从一个普通的中间提取名字 混合大小写风格的 Java 名称,那么默认情况下,名称将以大写字母开头。

Java 程序员习惯于让普通标识符以小写字母开头。 积极的审稿人意见使我们相信我们应该遵循同样的传统规则 用于属性和事件名称。

因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们 通常将第一个字符转换为小写。 不过支持偶尔使用所有 大写名称,我们检查名称的前两个字符是否都是大写的,如果 所以别管它。比如,

“FooBah”变成“fooBah” “Z”变成“z” “网址”变为“网址”

我们提供了一个方法Introspector.decapitalize来实现这个转换规则。

也就是说,我宁愿将它们重命名为更合理的名称。也许birthCity(如果我猜对了),这样你就可以很好地使用$registrationVO.birthCity

【讨论】:

您好 Balus,感谢您的回复。它真的帮助了我,因为它起作用了。但我会采纳您的建议并将其重命名为 billing City 和 billingState。谢谢,DJ 这个信息(关于两个大写字符),确实是真的。但是我怎样才能在不实际显示它有效的情况下将它引用给某人来证明这一事实呢?它是写在一些文档中,还是只写在 EL 代码本身中? @bluefoot:确实,在Javabeans spec 的第 8.8 章中有详细说明。我编辑了答案以包含引用。

以上是关于javax.el.PropertyNotFoundException 当属性名称的第二个字符是大写时的主要内容,如果未能解决你的问题,请参考以下文章