




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.@;JavaBean屬性命名規(guī)范問(wèn)題分析Eclipse根據(jù)這種方式生成getter訪問(wèn)器和setter設(shè)值器,由于屬性名isShowCode的is沒有去掉,以致javabean類違背了javabean的命名規(guī)范。問(wèn)題由來(lái):最近在一個(gè)javabean類中定義了一個(gè)boolean類型的變量://boolean屬性:是否顯示
private
boolean
isShowCode
;
//使用Eclipse自動(dòng)生成getter/setter方法如下:
public
boolean
isShowCode()
{
return
isShowCode;
}
public
void
setShowCode(boolean
isShowCode)
{
this.isShowCode
=
isShowCode;
}
spring在給javabean設(shè)置值的時(shí)候,拋出異常: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)
代碼運(yùn)行環(huán)境:jdk1.6+eclipse3.2+spring3.1,本文下面的代碼都在該環(huán)境下測(cè)試。原因跟蹤分析:跟蹤Spring源碼,可以看到下面這段代碼:private
CachedIntrospectionResults(Class
beanClass,
boolean
cacheFullMetadata)
throws
BeansException
{
...
...
this.beanInfo
=
new
ExtendedBeanInfo(Introspector.getBeanInfo(beanClass));
...
...
}
方法Introspector.getBeanInfo(beanClass)返回的時(shí)候,獲取到的javabean信息中的isShowCode屬性的名稱已經(jīng)被改成了"showCode"。
到這里可以確定問(wèn)題不是出在spring代碼中,網(wǎng)上有不少帖子說(shuō)是spring的處理規(guī)則導(dǎo)致了這個(gè)問(wèn)題,這里是不是可以否定這種看法?問(wèn)題跟蹤到這,也即跟蹤到了java.beans包。嘗試?yán)^續(xù)跟蹤JDK源碼,可能由于我的JDK的jar包和源碼不匹配的原因,eclipse總是監(jiān)控不到中間變量。也就沒有再跟蹤進(jìn)去了。可以知道的是,javabean中的isShowCode屬性和對(duì)應(yīng)的getter/setter方法應(yīng)該是沒有遵循javabean規(guī)范。Eclipse自動(dòng)生成的getter/setter方法看來(lái)也是存在一些問(wèn)題的。Eclipse自動(dòng)生成boolean類型屬性的方法是不是有點(diǎn)奇怪呢?屬性isShowCode的getter訪問(wèn)器是isShowCode()而不是getIsShowCode(),setter設(shè)值器是setShowCode()而不是setIsShowCode()。原來(lái)在javabean規(guī)范關(guān)于中提到,boolean屬性<propertyName>的getter訪問(wèn)器可以使用下面這種模式publicbooleanis<PropertyName>(){...};來(lái)代替publicbooleanget<PropertyName>(){...};Javabean規(guī)范(下載鏈接:/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/)在8.3章節(jié)"DesignPatternsforProperties"中的描述:Eclipse根據(jù)這種方式生成getter訪問(wèn)器和setter設(shè)值器,由于屬性名isShowCode的is沒有去掉,以致javabean類違背了javabean的命名規(guī)范。JavaBean的屬性名和getter/setter存取方法規(guī)則小結(jié):1.對(duì)于常規(guī)屬性<propertyName>,屬性名稱的第一個(gè)單詞小寫且字母?jìng)€(gè)數(shù)大于1,第二個(gè)單詞首字母大寫。對(duì)應(yīng)的getter/setter方法名為:get/set+<PropertyName>(),即屬性名稱的第一個(gè)單詞的首字母改成大寫,前面再加上"get"或"set"前綴。2.對(duì)于布爾類型<propertyName>,可以按常規(guī)屬性的規(guī)則編寫getter/setter方法外,getter方法可以使用is+<PropertyName>()的形式來(lái)代替。3.對(duì)于非常規(guī)屬性<pName>,屬性名稱的第一個(gè)單詞小寫且字母?jìng)€(gè)數(shù)等于1,第二個(gè)單詞首字母大寫。3.1)對(duì)應(yīng)的getter/setter方法名可以為:get/set+<PName>(),即第一個(gè)單詞的首字母為改為大寫,前面再加上"get"或"set"前綴。Eclipse3.2按這種方式自動(dòng)生成getter/setter方法。代碼片段:<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="pName">
<value>中國(guó)</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)對(duì)應(yīng)的getter/setter方法名也可以為:get/set+<pName>(),即屬性名稱不變,第一個(gè)單詞的首字母任然為小寫,前面再加上"get"或"set"前綴。這種方式也可以正常運(yùn)行。網(wǎng)上有帖子說(shuō)Eclipse3.5按這種方式自動(dòng)生成getter/setter方法。代碼片段:
<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="pName">
<value>中國(guó)</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.對(duì)于非常規(guī)屬性<PName>,屬性名稱的前兩個(gè)字母都是大寫。即連續(xù)兩個(gè)大寫字母開頭的屬性名。對(duì)應(yīng)的getter/setter方法名為:get/set+<PName>(),即屬性名稱不變,前面再加上"get"或"set"前綴。spring3.1配置文件代碼片段:<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="PName">
<value>中國(guó)</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.對(duì)于非常規(guī)屬性<Property>或<PropertyName>,屬性名稱第一個(gè)字母大寫。網(wǎng)上有帖子說(shuō)這是不符合JSR規(guī)范的,會(huì)報(bào)"屬性找不到"的錯(cuò)誤。(如帖子1:/blog/631838;帖子2:/w8y56f/blog/item/4fd037e845bbbe372cf5342a.html)。我在我的環(huán)境下測(cè)試了下,是不會(huì)報(bào)錯(cuò)的,可以正常運(yùn)行,雖然這種命名方式是令人難以忍受的:<bean
id="country"
class="com.codemouse.beans.Country"
lazy-init="true">
<property
name="PropertyName">
<value>中國(guó)</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;
}
測(cè)試方法:第一個(gè)@test方法用普通javabean調(diào)用方式測(cè)試;第二個(gè)@test方法使用spring創(chuàng)建bean
@Test
public
void
testJavaBeanNamingRule0(){
Country
country
=
new
Country();
country.setPropertyName("中國(guó)");
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());
}
運(yùn)行結(jié)果:都可以正常運(yùn)行。中國(guó)
123.45600128173828
log4j:WARN
No
appenders
could
be
found
for
logger
(org.springframework.core
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)儲(chǔ)物流場(chǎng)地租賃合同范文
- 博物館展品貸款合同
- 江西省會(huì)昌縣市級(jí)名校2024-2025學(xué)年第二學(xué)期初三物理試題期末試卷含解析
- 晉中師范高等專科學(xué)校《護(hù)理基本技能(Ⅱ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 不同職業(yè)的服裝課件圖片
- 江蘇省南京師范大附中江寧分校2024-2025學(xué)年初三年級(jí)第一次質(zhì)量檢監(jiān)測(cè)化學(xué)試題含解析
- 清遠(yuǎn)職業(yè)技術(shù)學(xué)院《植物生物技術(shù)概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 青海省西寧市海湖中學(xué)2024-2025學(xué)年初三下學(xué)期(4月)模擬考試生物試題試卷含解析
- 江蘇省南京市鳳凰花園城小學(xué)2024-2025學(xué)年數(shù)學(xué)三下期末統(tǒng)考試題含解析
- 西安電力高等專科學(xué)校《應(yīng)用英語(yǔ)四》2023-2024學(xué)年第二學(xué)期期末試卷
- 《何西阿書一概要》課件
- 超市經(jīng)銷商轉(zhuǎn)場(chǎng)協(xié)議書
- 中華全國(guó)律師協(xié)會(huì)律師知識(shí)產(chǎn)權(quán)盡職調(diào)查操作指引
- 人教版高一下學(xué)期期中考試數(shù)學(xué)試卷及答案(共兩套)
- 產(chǎn)科診療指南及技術(shù)操作規(guī)范
- 小學(xué)二年級(jí)數(shù)學(xué)三位數(shù)加減三位數(shù)計(jì)算同步練習(xí)口算題帶答案
- 發(fā)展?jié)h語(yǔ)初級(jí)口語(yǔ)I-第11課課件
- 免疫規(guī)劃工作經(jīng)驗(yàn)
- 第一單元字詞過(guò)關(guān)專題卷-2022-2023學(xué)年語(yǔ)文五年級(jí)下冊(cè)(部編版)
- 2024年無(wú)人駕駛行業(yè)培訓(xùn)資料 - 無(wú)人駕駛技術(shù)的商業(yè)應(yīng)用與法規(guī)管理
- 整本書《中國(guó)古代寓言故事》閱讀教學(xué)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論