




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.@;JavaBean属性命名规范问题分析Eclipse根据这种方式生成getter访问器和setter设值器,由于属性名isShowCode的is没有去掉,以致javabean类违背了javabean的命名规范。问题由来:最近在一个javabean类中定义了一个boolean类型的变量://boolean属性:是否显示
private
boolean
isShowCode
;
//使用Eclipse自动生成getter/setter方法如下:
public
boolean
isShowCode()
{
return
isShowCode;
}
public
void
setShowCode(boolean
isShowCode)
{
this.isShowCode
=
isShowCode;
}
spring在给javabean设置值的时候,抛出异常:Caused
by:
org.springframework.beans.NotWritablePropertyException:
Invalid
property
'isShowCode'
of
bean
class
[com.codemouse.beans.Country]:
Bean
property
'isShowCode'
is
not
writable
or
has
an
invalid
setter
method.
Did
you
mean
'showCode'?
at
org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1064)
代码运行环境:jdk1.6+eclipse3.2+spring3.1,本文下面的代码都在该环境下测试。原因跟踪分析:跟踪Spring源码,可以看到下面这段代码:private
CachedIntrospectionResults(Class
beanClass,
boolean
cacheFullMetadata)
throws
BeansException
{
...
...
this.beanInfo
=
new
ExtendedBeanInfo(Introspector.getBeanInfo(beanClass));
...
...
}
方法Introspector.getBeanInfo(beanClass)返回的时候,获取到的javabean信息中的isShowCode属性的名称已经被改成了"showCode"。
到这里可以确定问题不是出在spring代码中,网上有不少帖子说是spring的处理规则导致了这个问题,这里是不是可以否定这种看法?问题跟踪到这,也即跟踪到了java.beans包。尝试继续跟踪JDK源码,可能由于我的JDK的jar包和源码不匹配的原因,eclipse总是监控不到中间变量。也就没有再跟踪进去了。可以知道的是,javabean中的isShowCode属性和对应的getter/setter方法应该是没有遵循javabean规范。Eclipse自动生成的getter/setter方法看来也是存在一些问题的。Eclipse自动生成boolean类型属性的方法是不是有点奇怪呢?属性isShowCode的getter访问器是isShowCode()而不是getIsShowCode(),setter设值器是setShowCode()而不是setIsShowCode()。原来在javabean规范关于中提到,boolean属性<propertyName>的getter访问器可以使用下面这种模式publicbooleanis<PropertyName>(){...};来代替publicbooleanget<PropertyName>(){...};Javabean规范(下载链接:/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/)在8.3章节"DesignPatternsforProperties"中的描述:Eclipse根据这种方式生成getter访问器和setter设值器,由于属性名isShowCode的is没有去掉,以致javabean类违背了javabean的命名规范。JavaBean的属性名和getter/setter存取方法规则小结:1.对于常规属性<propertyName>,属性名称的第一个单词小写且字母个数大于1,第二个单词首字母大写。对应的getter/setter方法名为:get/set+<PropertyName>(),即属性名称的第一个单词的首字母改成大写,前面再加上"get"或"set"前缀。2.对于布尔类型<propertyName>,可以按常规属性的规则编写getter/setter方法外,getter方法可以使用is+<PropertyName>()的形式来代替。3.对于非常规属性<pName>,属性名称的第一个单词小写且字母个数等于1,第二个单词首字母大写。3.1)对应的getter/setter方法名可以为:get/set+<PName>(),即第一个单词的首字母为改为大写,前面再加上"get"或"set"前缀。Eclipse3.2按这种方式自动生成getter/setter方法。代码片段:<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="pName">
<value>中国</value>
</property>
<property
name="code">
<value>CN</value>
</property>
<property
name="showCode">
<value>true</value>
</property>
</bean>
private
String
pName;
public
String
getPName()
{
return
pName;
}
public
void
setPName(String
name)
{
pName
=
name;
}
3.2)对应的getter/setter方法名也可以为:get/set+<pName>(),即属性名称不变,第一个单词的首字母任然为小写,前面再加上"get"或"set"前缀。这种方式也可以正常运行。网上有帖子说Eclipse3.5按这种方式自动生成getter/setter方法。代码片段:
<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="pName">
<value>中国</value>
</property>
<property
name="code">
<value>CN</value>
</property>
<property
name="showCode">
<value>true</value>
</property>
</bean>
private
String
pName;
public
String
getpName()
{
return
pName;
}
public
void
setpName(String
name)
{
pName
=
name;
}
4.对于非常规属性<PName>,属性名称的前两个字母都是大写。即连续两个大写字母开头的属性名。对应的getter/setter方法名为:get/set+<PName>(),即属性名称不变,前面再加上"get"或"set"前缀。spring3.1配置文件代码片段:<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="PName">
<value>中国</value>
</property>
<property
name="code">
<value>CN</value>
</property>
<property
name="showCode">
<value>true</value>
</property>
</bean>
private
String
PName;
public
String
getPName()
{
return
PName;
}
public
void
setPName(String
name)
{
PName
=
name;
}
5.对于非常规属性<Property>或<PropertyName>,属性名称第一个字母大写。网上有帖子说这是不符合JSR规范的,会报"属性找不到"的错误。(如帖子1:/blog/631838;帖子2:/w8y56f/blog/item/4fd037e845bbbe372cf5342a.html)。我在我的环境下测试了下,是不会报错的,可以正常运行,虽然这种命名方式是令人难以忍受的:<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="PropertyName">
<value>中国</value>
</property>
<property
name="code">
<value>CN</value>
</property>
<property
name="showCode">
<value>true</value>
</property>
<property
name="Xcoordinate">
<value>12.345</value>
</property>
</bean>
private
String
PropertyName;
public
String
getPropertyName()
{
return
PropertyName;
}
public
void
setPropertyName(String
propertyName)
{
PropertyName
=
propertyName;
}
private
Double
Xcoordinate;
public
Double
getXcoordinate()
{
return
Xcoordinate;
}
public
void
setXcoordinate(Double
xcoordinate)
{
Xcoordinate
=
xcoordinate;
}
测试方法:第一个@test方法用普通javabean调用方式测试;第二个@test方法使用spring创建bean
@Test
public
void
testJavaBeanNamingRule0(){
Country
country
=
new
Country();
country.setPropertyName("中国");
country.setXcoordinate(Double.valueOf(123.456f));
System.out.println(country.getPropertyName());
System.out.println(country.getXcoordinate());
}
@Test
public
void
testJavaBeanNamingRule(){
ApplicationContext
ctx
=
new
ClassPathXmlApplicationContext("myBeans.xml");
Country
country
=
(Country)ctx.getBean("country");
System.out.println(country.getPropertyName());
System.out.println(country.getXcoordinate());
}
运行结果:都可以正常运行。中国
123.45600128173828
log4j:WARN
No
appenders
could
be
found
for
logger
(org.springframework.core
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025标准装修设计合同范本
- 《物业管理安全培训》课件
- 2025年版中外合资经营企业合同范本
- 2025年数控刃磨床项目合作计划书
- 2025年抗寄生虫病药项目合作计划书
- 2025年食品蒸发浓缩机械合作协议书
- 2025年钳型表项目合作计划书
- 防潮地面施工方案
- 产地直采核桃协议3篇
- 借款协议补签模板3篇
- 深信服超融合HCI技术白皮书-20230213
- 2025年陕西省土地工程建设集团有限责任公司招聘笔试参考题库附带答案详解
- 2024广西公务员【申论A卷、C卷+2023申论A卷】共3套真题及答案
- 《多样的中国民间美术》课件 2024-2025学年人美版(2024)初中美术七年级下册
- 人教版 七年级 下册 语文 第四单元《青春之光》课件
- 2024物业管理数字化升级服务合同
- 灌浆作业安全操作规程(3篇)
- 药品追回管理制度内容
- 二战时期的中国抗日战争
- 35kv变电站设备安装工程施工设计方案
- 煤炭清洁高效利用对策
评论
0/150
提交评论