Bom dia senhores
Estou desenvolvendo uma aplicação que recebe os dados em um arquivo texto separado por ponto-e-virgula. Tipo um CSV.
Tenho que pegar essa string, quebrar e jogar os dados no meu bean.
Estou usando java 1.4, fiz algo desse tipo:
String line = "sadasdasd;sdadas;dasdasd;asdasdas;dasdasdas;dasd;";
String fields[] = line.split(";");
for (int i = 0; i < fields.length; i++) {
bean.setNome(fields[0]);
bean.setEndereco(fields[1]);
//e por ai vai.
}
O problema é que é muito braçal a rotina de setar os valores no bean.
Pergunto:
O que poderia fazer para contornar isso? Se não me engano, em C#.net dá pra fazer via anotations um esquema que você mapeia o token com uma propriedade.
Alguem que já trabalhou com integrações em mainframe já deve ter passado por isso.
Existe alguma maneira de automatizar isso?
Bom, se você não tiver problemas de desempenho, pode tentar usar o BeanUtils para acessar os campos por nome via reflection, e você poderia especificar em um arquivo (properties?) a sequência dos campos. Talvez como:
para indicar que na hora de preencher os dados, nome = fields[0], … cpf = fields[3], residencia = fields[5] (note que pulei um field de propósito para indicar que ele não é usado).
Ou então gerar código (a partir desse mesmo arquivo properties), o que não dá problemas de desempenho mas sim de manutenção (a menos que você tenha um script ANT bom para compilar seu código).
Mas acho que isso é o menor dos seus problemas.
andre_a_s
Boa thingol… gostei da idéia de reflection e do properties.
Acho que vai funcionar bem, mas ainda tem uma coisinha.
Tem campos que devem ser tratados.
Por exemplo:
Nesse caso, acho que atrapalha um pouco a automação, certo ?
T
thingol
Com properties dá pra brincar à vontade. É só você ter paciência (daqui a pouco você vai criar um XML que é tão complicado de preencher quanto você escrever você mesmo o programa - não seja ambicioso demais.)
(note que # é especial em um arquivo .properties, assim como “:”, por isso usei um “-” mesmo.
rodrigoallemand
Vc pode passar a linha toda para um construtor e fazer o tratamento dentro dele, não seria uma boa ideia?
andre_a_s
É verdade… tem que tomar cuidado com a complexidade que isso vai ficar.
Mas legal thingol… muito obrigado, ajudou bastante!
T
thingol
Até aí isso é o de menos (se é em um construtor ou em um método).
Ele está reclamando é do trabalho braçal (e sujeito a erros bobos) que é desmontar a string e preencher os campos.
Eu sei bem disso, e sei que é fácil resolver isso com @Annotations (java 5.0 - se quiser fazer as coisas em tempo de execução)) ou XDoclet (1.4 ou anteriores - se quiser efetuar geração de código).
andre_a_s
Como você faria isso com Annotations ?
rodrigoallemand
thingol:
Até aí isso é o de menos (se é em um construtor ou em um método).
Ele está reclamando é do trabalho braçal (e sujeito a erros bobos) que é desmontar a string e preencher os campos.
Resta saber se este trabalho braçal é alterado constantemente ou se é totalmente estático e maduro. Acho que se ele sempre receber esta string, no mesmo formato, sem muitas alterações ao longo do sistema, existem maneiras mais faceis de fazer isso…
T
thingol
É meio chato (e um pouco pesado) porque você tem de fazer algo como:
e a classe Util (o nome não é legal; escolha um nome adequado…) tem de pegar a instância que você disponibilizou para o método inicializar, a string que você pediu para efetuar o split, e procurar os métodos que têm a anotação MinhaAnotacao; para cada um desses métodos, efetuar as conversões adequadas, e chamar o tal método. É braçal (e um pouco pesado) mas dá para fazer.
andre_a_s
Interessante.
É um pocuo trabalhoso, mas acho que depois fica fácil pra dar manutenção.
Mesmo assim, obrigado pelas dicas.
Vou bolar algo e assim que estiver pronto e funcionando eu posto aqui
Marky.Vasconcelos
Só pra aproveitar o tópico falando sobre Annotations
Como eu faço que um atributo da anotação possa ser preenchido ou não.
Como as anotações do Hibernate que posso setar em @Column o name ou não.