java培訓(xùn)-Java-Bean屬性命名規(guī)范問(wèn)題分析_第1頁(yè)
java培訓(xùn)-Java-Bean屬性命名規(guī)范問(wèn)題分析_第2頁(yè)
java培訓(xùn)-Java-Bean屬性命名規(guī)范問(wèn)題分析_第3頁(yè)
java培訓(xùn)-Java-Bean屬性命名規(guī)范問(wèn)題分析_第4頁(yè)
java培訓(xùn)-Java-Bean屬性命名規(guī)范問(wèn)題分析_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論