幾天前遇到這么一個(gè)問題,讓我郁悶了半天。當(dāng)初為了方便定義了以下的一個(gè)接口:
public interface IBusinessObject<PK extends Serializable> extends Serializable {
PK getPrimaryKey();
void setPrimaryKey(PK id);
}
在我的子類中是這么實(shí)現(xiàn)的
public class Code implements IBusinessObject<Long>{
private Long primaryKey;
public void setPrimaryKey(Long id){
this.primaryKey=id;
}
public Long getPrimaryKey(){
return primaryKey
}
}
在通常的實(shí)例化過程中,是不會(huì)存在問題的。當(dāng)時(shí)的問題是,我定義了另外一個(gè)類,用于引用Code
public class TestBean {
private Code code;
public void setCode(){
}
public Code getCode(){
}
}
當(dāng)在spring環(huán)境中時(shí),使用spring的bind類處理的時(shí)候,發(fā)現(xiàn),我的code.primaryKey的類型居然為Serializable,而不是我想要的Long
當(dāng)時(shí)以為其他地方搞錯(cuò)了,寫了個(gè)簡(jiǎn)單的測(cè)試代碼
TestBean b=new TextBean();
BeanWrapperImpl wrapper=new BeanWrapperImpl(b);
b.setPropertyValue("code.primaryKey","1");
assertTrue(b.getCode().getPrimaryKey() instanceof Long);
居然是失敗的。
只有在
b.setPropertyValue("code.primaryKey",new Long(1));
assertTrue(b.getCode().getPrimaryKey() instanceof Long);
才成功。
仔細(xì)跟蹤,發(fā)現(xiàn)原來(lái),泛型的時(shí)候,產(chǎn)生的編譯類中,有兩個(gè)同名的方法
public void setPrimaryKey(Long id){
this.primaryKey=id;
}
public Long getPrimaryKey(){
return primaryKey
}
和
public void setPrimaryKey(Serializable id){
this.primaryKey=id;
}
public Serializable getPrimaryKey(){
return primaryKey
}
而java.beans規(guī)范對(duì)于這種情況是沒有辦法分清楚,所以也就導(dǎo)致了結(jié)果和預(yù)期的不同。
如果是在程序中,這點(diǎn)算不了問題。可是我需要在web的頁(yè)面上進(jìn)行值的綁定,而輸入的東西,只能為字符串。所以不可能出來(lái)Long類型。
目前,采用了一種比較傻的辦法,在TestBean中增加了一個(gè)臨時(shí)變量x,通過x向code傳值
如下:
public void setWsCode(String wsCode) {
this.wsCode = wsCode;
if (StringUtils.isNumeric(wsCode))
this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
}
不知道還有沒有其他好的解決方案。
posted on 2007-04-17 08:22
布衣郎 閱讀(1575)
評(píng)論(1) 編輯 收藏 所屬分類:
jdk相關(guān)