Este código ele lê os parâmetros que estão no request e procura em uma classe (com reflection) um método set+“nome do parâmetro”.
Se ele encontrar algo, ele invoca o método e passa o valor do parâmetro do request para o parâmetro do método.
Mas tive um problema. O “request.getParameter(“xxx”)” traz sempre uma String. Se meu método receber um Integer dá pau… Tem como através de reflection ver que o parâmetro do método é um Integer(ou qq outra coisa) e fazer um Cast ??
Como assim não dá? :( Com Java tudo é possível. :twisted:
...if(p!=null){cast(action,method,p);}...publicvoidcast(ActionactionObject,Methodmethod,Stringvalue){if(method!=null&&value!=null&&!value.equals("")){Classclazz=method.getParameterTypes()[0];if(clazz.getName().equals("java.lang.Integer")){method.invoke(actionObject,newInteger(value));}elseif(clazz.getName().equals("java.lang.Long")){method.invoke(actionObject,newLong(value));}// Aqui se coloca o restante dos cast's...}}
Testa ae e depois me fala se funcionou...
cleriston
blz… eu tinha pensado em fazer isso… mas a queria saber se exist uma maneira mais automática, sem “ifs”, pois se um dia aparecer um metodo que recebe um boolean eu teria q adicionar um if nesse código
T
thingol
Bom, acho que você vai ter de se virar para isolar essa conversão - principalmente porque a string pode vir formatada (por exemplo, “20/07/2007”) , e aí você é que tem de desformatar a string.
Ou seja, não tenha preguiça de fazer um monte de ifs, porque isso é realmente necessário.
Uma forma de isolar a conversão em uma rotina isolada (e com ifs, é claro) é a seguinte:
staticObjectconvert(ClassparameterClass,Stringvalue){
if(parameterClass==Integer.class){
returnInteger.valueOf(value); // aqui estou supondo que //onúmerojávenha"desformatado."Senãouseasua//conversãofavorita.
}elseif(parameterClass==int.class){
returnInteger.valueOf(value); // tem de retornar um Integer, não um int}elseif(parameterClass==String.class){
returnvalue;}elseif(parameterClass==Boolean.class){
...
}elseif(parameterClass==boolean.class){
...
}
}
E note que Integer.class != int.class, e assim por diante; você tem de levar em conta isso também.
e você a usa assim:
method.invoke(actionObject,convert(clazz,value));
Pedrosa
Talvez você poderia anotar como Vraptor faz:
@ComponentpublicclassPersonLogic{@ParameterprivateStringname,address;@ParameterprivateintpreferredNumber;publicvoidadd(){System.out.printf("Adding %s, %s, %d to the database!%n",name,address,preferredNumber);}}