我的代码中有神秘的事情发生。这是bean的片段:
public List<HelpContentsFrag> getCFrags()
{
return cFrags;
}
public void setCFrags(List<HelpContentsFrag> 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并没有坚持使用这个装置。
仅供参考:当我将吸气剂更改为getContentsFrag()
并引用它.contentsFrag
时,这一切都很有效。
答案 0 :(得分:12)
我相信你想要:
cFrags:[${topic.CFrags}]
使用大写C.见JavaBeans Spec:
8.8推断名称的大写。
当我们使用设计模式来推断属性或事件名称时,我们需要决定使用推断名称大写的规则。如果我们从普通的mixedCase样式Java名称的中间提取名称,那么默认情况下,名称将以大写字母开头。 Java程序员习惯于使用小写字母开头。严谨的审稿人输入使我们确信我们应该遵循同样的传统规则来处理财产和事件名称。
因此,当我们从现有Java名称的中间提取属性或事件名称时,我们通常会将第一个字符转换为小写。但是,为了支持偶尔使用所有大写字母,我们检查名称的前两个字符是否都是大写,如果是,请不要管它。例如,
“FooBah”成为“fooBah”
“Z”变为“z”
“URL”变为“URL”我们提供了一个实现此转换规则的方法Introspector.decapitalize。
答案 1 :(得分:8)
引用JavaBeans specification(1997年最后更新):
因此当我们提取属性或 事件名称来自中间 现有的Java名称,我们通常 将第一个字符转换为低位 案件。但要支持了 偶尔使用所有大写字母 名字,我们检查前两个 名字的字符都是上面的 如果是这样的话,请不要理会。 p>
它描述了方法名称如何转换为属性名称。不太清楚的是,Introspector生成了一个由property-&gt;方法查找使用的表。
您已经发现了一种避免此问题的方法。另一种方法是创建一个BeanInfo
类,其中包含正确的属性 - &gt;方法映射(Introspector
doc描述了如何执行此操作)。