lishunli / nutz

Automatically exported from code.google.com/p/nutz
0 stars 0 forks source link

无法进行多态注入的问题 #180

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
NUTZ在注入的时候是使用如下方式:
1. 
根据field加上set前缀在实体的方法中进行查询,如果只有一个,�
��返回这个方法
2. 如果是boolean类型则,将is前缀去掉加set
3. 直接根据field名
4. 如果以上都不满足,则以属性注入.

问题来了,如果我有多个set方法呢?比如,有这样一个类:
class test{
List<String> labs
setLabs(List<String> labs){
this.labs = labs;
}
setLabs(String labs){
for(String lab : labs.split(",")){
this.labs.add(lab);
}
}
}

因为出于某些原因,这里我只能传一个"abc,abc,abc,abc"这种形式��
�参数过来,但是因
为注入的原理,所以导致nutz根本就不会去查询多态的方法,也��
�导致不能进行String 
到List<String>的转换...

另外getInjecting方法中的
Method[] sss = this.findSetters(fieldName);
        if (sss.length == 1)
            return new InjectBySetter(sss[0]);
与
try {
                return klass.getMethod("set" + 
Strings.capitalize(field.getName()), field.getType());
            }
重复,我觉得这里可以只要一个就可以了,

Original issue reported on code.google.com by zkgale@gmail.com on 12 May 2010 at 3:16

GoogleCodeExporter commented 9 years ago
对了,还有一点InjectBySetter中的valueType是直接使用实体类型的��
�的....

Original comment by zkgale@gmail.com on 12 May 2010 at 3:20

GoogleCodeExporter commented 9 years ago
想了半天,这个地方可不可以这样解决:
getInjecting方法返回一个指定属性所有set方法列表,而在注入的�
��候对所有set方法进行递归注
入,如果一个方法抛异常,则转到下一个,如果所有方法都抛异��
�的话,才说明注入失败

因为这种方案的话,要改变的地方有点多,我也就没有去实现了

Original comment by zkgale@gmail.com on 12 May 2010 at 4:22

GoogleCodeExporter commented 9 years ago
我这个地方按上面的思路做了一点实现,那们大大看看吧,
恩,没有专门写测试用例,只是简单的测试了一下,还有,有些地�
��可能要调整的,我这里只是提出一些
我的实现,如果可以用的话,还是要修改的...

Original comment by zkgale@gmail.com on 12 May 2010 at 6:49

Attachments:

GoogleCodeExporter commented 9 years ago
额, 据闻这不是多态, 是重载...

我觉得这样的需求应该不多,暂时降低优先级吧.

Original comment by wendal1985@gmail.com on 12 May 2010 at 7:46

GoogleCodeExporter commented 9 years ago
管它叫什么,反正就那意思嘿嘿嘿嘿嘿嘿

Original comment by zkgale@gmail.com on 12 May 2010 at 7:49

GoogleCodeExporter commented 9 years ago
你测试过吗? 
我是说,如果你的setter 是  setLabels(List<String> strList)
而你的参数是 "['a','b','c','d']" // 一个 JSON 字符串
那么,应该会被正确转换的

如果你的 setter 是 setLables(String[] strList)
那么你的参数可以为下面两种形式
  >  "a,b,c,d,e"
  >  "['a','b','c','d']"

详细的转换代码,请参看
org.nutz.castor.castor.String2Collection
org.nutz.castor.castor.String2Array

Original comment by zozoh...@gmail.com on 13 May 2010 at 6:58

GoogleCodeExporter commented 9 years ago

Original comment by zozoh...@gmail.com on 13 May 2010 at 7:07

GoogleCodeExporter commented 9 years ago
恩,我这里提到的重载注入,并不是指框架来实现对数据的拆分
,而是指当实体对同一属性有多种
setter方法的时候,框架应该根据不同的参数类型去选择相应的s
etter方法,
而且具体的转换规则由使用者自己定义.

因为现在方法注入只选择一个....如果这个方法出现类型转换�
��败,则会出错

Original comment by zkgale@gmail.com on 13 May 2010 at 7:21

GoogleCodeExporter commented 9 years ago
那个是类型转换框架 Nutz.Castor 的任务。
我们只追求,在合理的情况下,能完成转换任务。 
极端的情况下,则可以通过 直接注入 
Request,或者将入口函数参数声明成字符串形
式的,来避免。

而现在,我们似乎还没看到一个比较合理的例子来说明:“��
�个 POJO 的某个字段必须有两个  
setter,否则某些功能就实现不了或者实现
起来非常繁琐”

Original comment by zozoh...@gmail.com on 13 May 2010 at 1:27

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
来点直接的吧,

//文章
class article{
    List<String> labs = new ArrayList<String>();    //标签,这个应该可以理解吧,现
在很多文章都有这东西,就理解成关键字也可以

    public void setLabs(List<String> labs){
        this.labs = labs;
    }
    public List<String> getLabs(){
        return labs;
    }

//上面的都没问题吧///////////////////////////////////////////////

    //我希望传一个字符串过来,然后我自己进行解析
    //格式:"电脑,发展史,冯若依曼,笔记本"
    public void setLabs(String labs){
        for(String s : labs.splis(",")){
            this.labs.add(s);
        }
    }
}

就上面这个类,如果我对labs进行注入 
"电脑,发展史,冯若依曼,笔记本" 会有什么情况呢?
会抛异常(见附件),为什么呢?因为nutz 
不能判断是注入那个方法的,默认注入
setLabs(List<String> 
labs),因为labs的类型就是List<String>,所以理所当然的就只找参数
类
型为List<String>的咯,是吧.

但是这种方法重载的情况本身就是面向对象语言特性的一种,�
��以出现这种情况是无可厚非的.

或许有人会觉得,小样,你不知道把 
"电脑,发展史,冯若依曼,笔记本" 组装成 [电脑,发展史,冯
若依曼,笔记本] 
的形式吗?是,我是可以这样组装,但是,是不是我要多写几条语�
��来进行这种组
装呢?是不是每个重载的地方我都要进行这样的组装呢?再有,��
�实体里面都已经有一个现成的转换
方法了,为什么我还要去多写几条语句呢???

或许List<String>可以以[XX,YY]的形式,那其它的情况也可以这样吗
???

我这段时间在用google api engine 
来写个小东西,里面String不能太长,所以只能使用GAE提供的
Text来存储,但是问题来了,String不能自动封装成Text,而Text也不��
�直接转成我要的String,那
我想请问,我这个实体应该怎么写???我是只写一个setXX(String 
x)呢,还是只写一个setXX(Text 
x)呢???我在JAVA中处理我可以全部使用setXX(String 
x),但是我在从数据库得到值的过程中则必
须使用setXX(Text x),别告诉我在每个地方都让我进行转换处理...

zozohtnt大大说得对,你对Nutz.Castor给我转下String->Text看看,
并且,难道不觉得nutz不应该主动去进行复杂的类型转换吗?基��
�数据类型进行转,这是无可厚非
的,但是nutz的目的不是为用户进行类型转换,而是为用户的实��
�在适当的情况下,注入适当的值,
你管他被注入后怎么处理呢?只要他传过来的东西能塞到实体�
��面就行了,不是吗???但现在nutz情
况却是,我要正常的值根本就塞不进去,而且还报错....

Original comment by zkgale@gmail.com on 15 May 2010 at 7:27

Attachments:

GoogleCodeExporter commented 9 years ago
如果可能的话,我还是希望能各位看看我之前传上来的实现...

Original comment by zkgale@gmail.com on 15 May 2010 at 7:36

GoogleCodeExporter commented 9 years ago
我已经把你加入 http://code.google.com/p/nutzlab
请将代码上传到这里. 非常感谢你热心支持 ^_^

Original comment by wendal1985@gmail.com on 15 May 2010 at 8:39

GoogleCodeExporter commented 9 years ago

Original comment by wendal1985@gmail.com on 30 Jan 2012 at 8:46