public interface IBusinessObject<PK extends Serializable> extends Serializable {
PK getPrimaryKey();
void setPrimaryKey(PK id);
}
在我的子cM是这么实现的
public class Code implements IBusinessObject<Long>{
private Long primaryKey;
public void setPrimaryKey(Long id){
this.primaryKey=id;
}
public Long getPrimaryKey(){
return primaryKey
}
}
在通常的实例化q程中,是不会存在问题的。当时的问题是,我定义了另外一个类Q用于引用Code
public class TestBean {
private Code code;
public void setCode(){
}
public Code getCode(){
}
}
当在spring环境中时Q用spring的bindcd理的时候,发现Q我的code.primaryKey的类型居然ؓSerializable,而不是我惌的Long
当时以ؓ其他地方搞错了,写了个简单的试代码
TestBean b=new TextBean();
BeanWrapperImpl wrapper=new BeanWrapperImpl(b);
b.setPropertyValue("code.primaryKey","1");
assertTrue(b.getCode().getPrimaryKey() instanceof Long);
居然是失败的?br>只有?br>
b.setPropertyValue("code.primaryKey",new Long(1));
assertTrue(b.getCode().getPrimaryKey() instanceof Long);
才成功?br>仔细跟踪Q发现原来,泛型的时候,产生的编译类中,有两个同名的Ҏ
public void setPrimaryKey(Long id){
this.primaryKey=id;
}
public Long getPrimaryKey(){
return primaryKey
}
?br> public void setPrimaryKey(Serializable id){
this.primaryKey=id;
}
public Serializable getPrimaryKey(){
return primaryKey
}
而java.beans规范对于q种情况是没有办法分清楚Q所以也导致了l果和预期的不同?br>如果是在E序中,q点不了问题。可是我需要在web的页面上q行值的l定Q而输入的东西Q只能ؓ字符丌Ӏ所以不可能出来Longcd?br>目前Q采用了一U比较傻的办法,在TestBean中增加了一个时变量xQ通过x向code传?br>如下Q?br>
public void setWsCode(String wsCode) {
this.wsCode = wsCode;
if (StringUtils.isNumeric(wsCode))
this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
}
不知道还有没有其他好的解x案?br>

]]>