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

Jsp javax.el.PropertyNotFoundException当属性名称的第二个字符为大写时,jsp,el,propertynotfoundexception,Jsp,El,Propertynotfoundexception,我有一个不寻常的场景: 我有一个注册VO,几乎没有属性和getter setter。 例如city或bCity及其getter方法getCity()和getBCity() 在JSP中,我尝试使用scriplets显示这些属性的值, 和,它工作正常。 但我用表情语言代替了这个, ${registrationVO.city}和${registrationVO.bCity} 我在registrationVO中找不到属性“bCity”时出错。 我再次为bCity使用了scriplet,我得到了输出 我注

我有一个不寻常的场景:

我有一个注册VO,几乎没有属性和getter setter。 例如
city
bCity
及其getter方法
getCity()
getBCity()

在JSP中,我尝试使用scriplets显示这些属性的值,
和,它工作正常。 但我用表情语言代替了这个,
${registrationVO.city}
${registrationVO.bCity}
我在registrationVO中找不到属性“bCity”时出错。 我再次为bCity使用了scriplet,我得到了输出

我注意到这是因为命名惯例。“如果物业的第二个字符是大写字母,我们不能使用表达语言”。我尝试了很多不同的方法,这就是我发现的

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

谢谢,
DJ

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

8.8推断名称的大写。 当我们使用设计模式来推断属性或事件名称时,我们需要确定哪些规则 以使推断出的名称大写。如果我们从法线的中间提取名称 mixedCase样式的Java名称-默认情况下,名称将以大写字母开头

Java程序员习惯于使用以小写字母开头的普通标识符。 评审员的积极投入使我们确信,我们应该遵循同样的常规规则 用于属性和事件名称

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

  • “FooBah”变成“FooBah”
  • “Z”变成“Z”
  • “URL”变为“URL”
我们提供了一个实现此转换规则的方法
Introspector.decapitalize


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

你好,谢谢你的回复。它真的帮助了我,因为它的工作。但是我接受你的建议,把它改名为billing City和billingState。谢谢,DJ,这些信息(关于两个大写字符)确实是真的。但我怎么能引用它来证明这一事实而不实际证明它是有效的呢?它写在一些文档中,或者只写在EL代码本身中?@bluefoot:确实,它是在的第8.8章中指定的。我编辑了答案,加入了一个引用。