几天前遇到这么一个问题,让我郁闷了半天。当初为了方便定义了以下的一个接口:
<pk extends="" serializable="">
</pk>
在我的子类中是这么实现的
在通常的实例化过程中,是不会存在问题的。当时的问题是,我定义了另外一个类,用于引用Code
当在spring环境中时,使用spring的bind类处理的时候,发现,我的code.primaryKey的类型居然为Serializable,而不是我想要的Long
当时以为其他地方搞错了,写了个简单的测试代码
居然是失败的。
只有在
才成功。
仔细跟踪,发现原来,泛型的时候,产生的编译类中,有两个同名的方法
而java.beans规范对于这种情况是没有办法分清楚,所以也就导致了结果和预期的不同。
如果是在程序中,这点算不了问题。可是我需要在web的页面上进行值的绑定,而输入的东西,只能为字符串。所以不可能出来Long类型。
目前,采用了一种比较傻的办法,在TestBean中增加了一个临时变量x,通过x向code传值
如下:
不知道还有没有其他好的解决方案。
<pk extends="" serializable="">
</pk>
java 代码
- public interface IBusinessObject《PK extends Serializable> extends Serializable {
- PK getPrimaryKey();
- void setPrimaryKey(PK id);
- }
在我的子类中是这么实现的
java 代码
- public class Code implements IBusinessObject〈Long〉<long>{ </long>
- private Long primaryKey;
- public void setPrimaryKey(Long id){
- this.primaryKey=id;
- }
- public Long getPrimaryKey(){
- return primaryKey
- }
- }
在通常的实例化过程中,是不会存在问题的。当时的问题是,我定义了另外一个类,用于引用Code
java 代码
- public class TestBean {
- private Code code;
- public void setCode(){...}
- public Code getCode(){...}
- }
当在spring环境中时,使用spring的bind类处理的时候,发现,我的code.primaryKey的类型居然为Serializable,而不是我想要的Long
当时以为其他地方搞错了,写了个简单的测试代码
java 代码
- TestBean b=new TextBean();
- BeanWrapperImpl wrapper=new BeanWrapperImpl(b);
- b.setPropertyValue("code.primaryKey","1");
- assertTrue(b.getCode().getPrimaryKey() instanceof Long);
居然是失败的。
只有在
java 代码
- b.setPropertyValue("code.primaryKey",new Long(1));
- assertTrue(b.getCode().getPrimaryKey() instanceof Long);
才成功。
仔细跟踪,发现原来,泛型的时候,产生的编译类中,有两个同名的方法
java 代码
- 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规范对于这种情况是没有办法分清楚,所以也就导致了结果和预期的不同。
如果是在程序中,这点算不了问题。可是我需要在web的页面上进行值的绑定,而输入的东西,只能为字符串。所以不可能出来Long类型。
目前,采用了一种比较傻的办法,在TestBean中增加了一个临时变量x,通过x向code传值
如下:
java 代码
- public void setWsCode(String wsCode) {
- this.wsCode = wsCode;
- if (StringUtils.isNumeric(wsCode))
- this.code.setPrimaryKey(NumberUtils.toLong(wsCode));
- }
不知道还有没有其他好的解决方案。