版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.@;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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淘宝客服试用期转正工作总结
- 活着的读书心得
- 23.1.1 锐角的三角函数 同步练习
- 23.2 相似图形 同步练习
- 江苏省扬州市扬大附中2024-2025学年高一上学期联考英语试卷(含解析)
- 河北省秦皇岛市卢龙县2024-2025学年八年级上学期期中地理试题
- 语文教学论教案 第二章 语文教材
- 个人车位买卖协议书范本
- 联合体投标协议书模板2024年
- 调研报告:养老护理员现状、存在问题及对策建议
- DB22T 5165-2024 建设工程消防验收现场评定标准
- 能源中国学习通超星期末考试答案章节答案2024年
- 2024广东省云浮市郁南县财政局工程造价类专业人员招聘4人高频难、易错点500题模拟试题附带答案详解
- 人工智能时代高等院校教师信息素养提升研究
- 军队文职考试《公共科目》试题及答案指导(2024年)
- 商家联盟合作方案
- 广东省广州市2021年中考英语真题(含答案)
- 《应用统计学》(第4版)-自测试卷及答案A卷
- 公司法课件(新员工)
- GB/T 10082-2024轨道车重型轨道车
- 山东省青岛市2023-2024学年七年级上学期期末考试数学试题(含答案)
评论
0/150
提交评论