【问题标题】:Am I misunderstanding the JavaBean method naming convention or is this an anomoly?我是误解了 Java Bean 方法命名约定还是异常?
【发布时间】:2011-04-08 18:35:17
【问题描述】:

我的代码中有一些神秘事件。这是 bean 中的 sn-p:

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

public void setCFrags(List<HelpContentsFrag> frags)
{
    cFrags = frags;
}

这是我查看代码(标记文件)中的 sn-p

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 时,这一切都很好。

【问题讨论】:

    标签: java methods naming-conventions javabeans


    【解决方案1】:

    我相信你想要:

    cFrags:[${topic.CFrags}]
    

    使用大写字母 C。见 JavaBeans Spec:

    8.8 推断名称的大写。

    当我们使用设计模式来推断属性或事件名称时,我们需要决定遵循哪些规则来将推断的名称大写。如果我们从普通的混合大小写样式 Java 名称的中间提取名称,那么默认情况下,名称将以大写字母开头。 Java 程序员习惯于让普通标识符以小写字母开头。审稿人的积极反馈使我们相信,我们应该遵循同样的属性和事件名称的常规规则。

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

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

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

    【讨论】:

    • 我只是使用 getContentsFrag 直到我读到这个。我很惊讶我在发布之前没有尝试过。无论如何,谢谢你的提示。我将其更改为 CFrags,一切顺利。我想上下文理解有时是不够的。再次感谢!
    【解决方案2】:

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

    因此,当我们提取一个属性或 中间的事件名称 现有的 Java 名称,我们通常 将第一个字符转换为小写 案子。不过为了支持 偶尔使用全部大写 名字,我们检查前两个 名字的字符都是大写的 如果是这样,请不要理会它。

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多