我是否误解了JavaBean方法命名约定或者这是一个exception?

我的代码中有神秘的事情发生。 这是bean的片段:

public List getCFrags() { return cFrags; } public void setCFrags(List frags) { cFrags = frags; } 

这是我的视图代码(标记文件)中的片段

 cFrags:[${topic.cFrags}] 

其中topic是bean类型的对象。

这是错误:

 javax.el.PropertyNotFoundException: Property 'cFrags' not found on type com.company.beans.BeanClass 

还有一件事需要考虑。 eclipse生成的setter有一个细微的差别。 显然,它也不喜欢cFrags这个名字。 字段名称是cFrags,并且每隔一个setter我都会得到与该字段同名的参数,并使用约定this.fieldName = fieldName 。 你会注意到eclipse并没有坚持这个setter。

仅供参考:当我将getter更改为getContentsFrag()并引用它.contentsFrag时,这一切都很有效。

我相信你想:

 cFrags:[${topic.CFrags}] 

使用大写C.参见JavaBeans规范 :

8.8推断名称的大写。

当我们使用设计模式来推断属性或事件名称时,我们需要确定要使用推断名称大写的规则。 如果我们从普通的mixedCase样式Java名称的中间提取名称,那么默认情况下,名称将以大写字母开头。 Java程序员习惯于使用小写字母开始使用普通标识符。 严谨的评论者输入使我们确信我们应该遵循同样的传统规则来处理属性和事件名称。

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

“FooBah”成为“fooBah”
“Z”变为“z”
“url”变为“url”

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

引用JavaBeans规范 (最后更新于1997年):

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

这描述了方法名称如何转换为属性名称。 不太清楚的是Introspector会生成一个由property->方法查找使用的表。

您已经发现了一种避免此问题的方法。 另一种方法是创建一个包含正确的属性 – >方法映射的BeanInfo类( Introspector doc描述了如何执行此操作)。