【Jsp精品源码栏目提醒】:网学会员鉴于大家对Jsp精品源码十分关注,论文会员在此为大家搜集整理了“JavaBean属性命名规范问题分析 - 软件工程”一文,供大家参考学习
本文标签:Java Bean 问题由来: 近期在一个 java bean 类中定义了一个 boolean 类型的变量: //boolean 属性:是否显示 private boolean isShowCode // 使用 Eclipse 自动生成 getter/setter 步骤如下: public boolean isShowCode return isShowCode public void setShowCodeboolean isShowCode this.isShowCode isShowCode spring 在给 java bean 设置值的时候, 抛出异样: 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.setPropertyValueBeanWrapperImpl.java:1064 代码运行环境: jdk 1.6 eclipse 3.2 spring 3.1 本文下面的代码都在该环境下测试 。
缘由跟踪 综合:跟踪 Spring
源码, 可以看到下面这段代码: private CachedIntrospectionResultsClass beanClass boolean cacheFullMetadata throws BeansException ... ... this.beanInfo new ExtendedBeanInfoIntrospector.getBeanInfobeanClass ... ... 步骤 Introspector.getBeanInfobeanClass返回的时候,猎取到的 java bean 信息中的 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 。
原来在 java bean 标准关于中提到,boolean 属性的 getter 拜访器 可以 使用下面这种模式 public boolean is... 来接替 public boolean get... Javabean 标准下载链接:http://download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/ 在8.3 章节Design Patterns for Properties 中的形容: Eclipse 依据这种 模式生成 getter 拜访器和 setter 设值器, 因为属性名 isShowCode 的 is 没有去掉, 以致 java bean类违反了 java bean 的命名 标准 。
JavaBean 的属性名和 getter/setter 存取步骤规定小结: 1. 关于通例属性 , 属性名称的第一个单词小写且字母个数大于1, 第二个单词首字母大写 。
对应的 getter/setter 步骤名为:get /set , 即属性名称的第一个单词的首字母改成大写, 前面再外加get或set前缀 。
2. 关于布尔类型 , 可以按通例属性的规定编写 getter/setter 步骤外, getter 步骤 可以 使用 is 的模式来接替 。
3. 关于非通例属性, 属性名称的第一个单词小写且字母个数等于1,第二个单词首字母大写 。
3.1 对应的 getter/setter 步骤名 可认为:get/set , 即第一个单词的首字母为改为大写,前面再外加get或set前缀 。
Eclipse3.2 按这种 模式自动生成 getter/setter 步骤 。
代码片段: country classcom.codemouse.beans.Country lazy-inittrue namepName 中国 o code CN o showCode true o o private String pName public String getPName return pName public void setPNameString name pName name 3.2 对应的 getter/setter 步骤名也 可认为:get/set , 即属性名称不变,第一个单词的首字母任然为小写,前面再外加get或set前缀 。
这种 模式也 可以畸形运行 。
网上有帖子说 Eclipse3.5按这种 模式自动生成 getter/setter 步骤 。
代码片段: country classcom.codemouse.beans.Country lazy-inittrue o pName 中国 o code CN showCode true o private String pName public String getpName return pName public void setpNameString name pName name 4. 关于非通例属性, 属性名称的前两个字母都是大写 。
即延续两个大写字母开头的属性名 。
对应的 getter/setter 步骤名为: get/set , 即属性名称不变,前面再外加get或set前缀 。
spring3.1 配置文件代码片段: country classcom.codemouse.beans.Country lazy-inittrue PName 中国 code CN showCode true o private String PName public String getPName return PName public void setPNameString name PName name 5. 关于非通例属性或, 属性名称第一个字母大写 。
网上有帖子说这是不相符 JSR 标准的,会报 属性找不到 的舛误 。
如帖子1: http://lzh166.iteye.com/blog/631838 ; 帖子2: http://hi.baidu.com/w8y56f/blog/item/4fd037e845bbbe372cf5342a.html 。
我在我的 环境下测试了下, 是不会报错的, 可以畸形运行,固然这种命名 模式是令人难以忍耐的: 中国value property CNvalue property truevalue property 12.345value property bean private String PropertyName public String getPropertyName return PropertyName public void setPropertyNameString propertyName PropertyName propertyName private Double Xcoordinate public Double getXcoordinate return Xcoordinate public void setXcoordinateDouble xcoordinate Xcoordinate xcoordinate 测试步骤: 第一个test 步骤用一般 javabean 调用 模式测试; 第二个test 步骤 使用 spring 缔造 bean Test public void testJavaBeanNamingRule0 Country country new Country country.setPropertyName中国 country.setXcoordinateDouble.valueOf123.456f System.out.printlncountry.getPropertyName System.out.printlncountry.getXcoordinate Test public void testJavaBeanNamingRule ApplicationContext ctx new ClassPathXmlApplicationContextmyBeans.xml Country country Countryctx.getBeancountry System.out.printlncountry.getPropertyName System.out.printlncountry.getXcoordinate 运行后果:都 可以畸形运行 。
中国 123.45600128173828 log4j:WARN No appenders could be found for logger org.springframework.core.env.StandardEnvironment. log4j:WARN Please initialize the log4j system properly. 中国 12.345 总结: 1. javabean 属性命名尽量 使用通例的驼峰式命名规定 2. 属性名第一个单词尽量幸免 使用一个字母:如 eBook, eMail 。
3. boolean 属性名幸免 使用 “is” 开头的名称 4. 随着 jdk, eclipse, spring 等软件版本的不停普及, 底版本的浮现的问题可能在高版本中解决了, 低版本原来畸形的代码可能在高版本环境下不再支撑 。
原文链接:http://blog.csdn.net/yunye114105/article/details/7364264