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

发布于 2024-10-31 03:24:25 字数 717 浏览 1 评论 0原文

我的代码中发生了神秘的事情。这是 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,对于所有其他设置器,我获取与字段同名的参数,并使用约定 this.fieldName = fieldName 进行设置。你会注意到 eclipse 并没有坚持这个设置器。

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

I have mysterious happenings in my code. Here's the snippet from the bean:

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

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

Here's the snippet from my view code (tag file)

cFrags:[${topic.cFrags}]

where topic is an object of the bean type.

Here's the error:

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

One additional thing to consider. There is a subtle difference in the eclipse-generated setter. Apparently, it didn't like the name cFrags either. The field name is cFrags and with every other setter I get parameter with the same name as the field and it is set using the convention this.fieldName = fieldName. You'll notice that eclipse did not stick with that on this setter.

FYI: this all works great when I change the getter to getContentsFrag() and reference it .contentsFrag.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独孤求败 2024-11-07 03:24:25

我相信你想要:

cFrags:[${topic.CFrags}]

大写的 C。请参阅 JavaBeans Spec:

8.8 推断名称的大写。

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

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

“FooBah”变成“fooBah”
“Z”变成“z”
“URL”变成“URL”

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

I believe you want:

cFrags:[${topic.CFrags}]

With a capital C. See JavaBeans Spec:

8.8 Capitalization of inferred names.

When we use design patterns to infer a property or event name, we need to decide what rules to follow for capitalizing the inferred name. If we extract the name from the middle of a normal mixedCase style Java name then the name will, by default, begin with a capital letter. Java programmers are accustomed to having normal identifiers start with lower case letters. Vigorous reviewer input has convinced us that we should follow this same conventional rule for property and event names.

Thus when we extract a property or event name from the middle of an existing Java name, we normally convert the first character to lower case. However to support the occasional use of all upper-case names, we check if the first two characters of the name are both upper case and if so leave it alone. So for example,

“FooBah” becomes “fooBah”
“Z” becomes “z”
“URL” becomes “URL”

We provide a method Introspector.decapitalize which implements this conversion rule.

你列表最软的妹 2024-11-07 03:24:25

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

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

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

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

To quote the JavaBeans specification (last updated in 1997):

Thus when we extract a property or
event name from the middle of an
existing Java name, we normally
convert the first character to lower
case. However to support the
occasional use of all upper-case
names, we check if the first two
characters of the name are both upper
case and if so leave it alone.

That describes how method names are converted to property names. What's not so clear is that the Introspector produces a single table that's used by property->method lookups as well.

You've already discovered one way to avoid the problem. Another is to create a BeanInfo class that contains the correct property->method mappings (the Introspector doc describes how to do this).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文