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

KSe*_*Sev 6 java methods naming-conventions javabeans

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

public List<HelpContentsFrag> getCFrags()
{
    return cFrags;
}

public void setCFrags(List<HelpContentsFrag> frags)
{
    cFrags = frags;
}
Run Code Online (Sandbox Code Playgroud)

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

cFrags:[${topic.cFrags}]
Run Code Online (Sandbox Code Playgroud)

其中topic是bean类型的对象.

这是错误:

javax.el.PropertyNotFoundException: Property 'cFrags' not found on type com.company.beans.BeanClass
Run Code Online (Sandbox Code Playgroud)

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

仅供参考:当我改变吸气剂getContentsFrag()并参考它时,这一切都很有效.contentsFrag.

Whi*_*g34 12

我相信你想:

cFrags:[${topic.CFrags}]
Run Code Online (Sandbox Code Playgroud)

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

8.8推断名称的大写.

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

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

"FooBah"变成"fooBah"
"Z"变成"z"
"URL"变成"URL"

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


Ano*_*non 8

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

因此,当我们从现有Java名称的中间提取属性或事件名称时,我们通常会将第一个字符转换为小写.然而,支持偶尔使用全大写的名字,我们检查,如果名字的前两个字符都是大写,如果是息事宁人.

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

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