| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/01/2012 21:17:43
|
thiagobaptista
JavaChild
![[Avatar]](/images/avatar/45a5c0d5cf3b363b1c4985f161fbbd98.jpg)
Membro desde: 09/07/2010 15:43:03
Mensagens: 131
Localização: Cidade Maravilhosa / RJ
Offline
|
Salve, galera!
Não sei se aqui é o espaço ideal para discutir isso, mas a questão é que há um tempo venho querendo contribuir com o vRaptor, tanto por uma questão de aprendizado pessoal quanto pelo fato de eu o considerar um dos melhores frameworks MVC para Java.
Há um recurso novo no mais recente release dele que é a anotação @Load nos parâmetros dos métodos dos controladores, que faz com que uma entidade com um atributo "id" seja automagicamente carregada do banco de dados, dispensando a necessidade de criar mais código, como um DAO, para essa tarefa.
Por debaixo dos panos, o que o framework faz é recuperar o parâmetro "id" da entidade e, através de um EntityManager, mandar um "find" e recuperá-la.
Achei muito bacana, porém vejo que há situações em que seria necessário fazer mais que simplesmente chamar um "em.find()". Por exemplo, nas situações em que é necessário preencher alguma dependência dessa entidade, ou realizar algum processamento sobre ela.
Um bom exemplo disso é essa discussão no blog da Caelum, sobre o uso do padrão Repository, que exigiria injetar uma classe que implementasse esse padrão na entidade recuperada, mais ou menos assim:
O que eu pensei em implementar seria uma outra anotação, que chamei de @LoadWith, que receberia como parâmetro um ".class" de uma classe-fábrica, talvez implementando uma interface específica e que, instanciando-a, delegaria a ela a carga dessa entidade. Ficaria mais ou menos assim:
E num método de um controlador qualquer:
A questão é que eu tenho dificuldade de imaginar como implementar isso... porque eu não tenho experiência ainda com contribuição para projetos de código aberto.
Eu sei que a classe responsável pera mágica é essa aqui. Mas estou com dificuldade em compreender exatamente como o método intercept() funciona, e como refatorá-lo para essa nova funcionalidade.
Como posso começar?
|
Thiago Baptista - \\//
contato@thiagobaptista.com
Desenvolvedor Web
Analista Desenvolvedor Java Pleno - DBA Engenharia de Sistemas
Usuário Linux #492635
Você sabe que Java é uma plataforma divertida quando você cria um arquivo Guerra, que referencia uma Jarra, dentro de uma Orelha.
"A vida é bela; que as futuras gerações a livrem de todo mal, opressão e violência, e possam desfrutá-la em sua plenitude..."
-- Leon Trotsky |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 12:39:54
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
Olá Thiago!
muito obrigado pela contribuição e pela idéia!
na anotação vc pode usar:
para forçar a classe a ser um loader.
básicamente vc precisa alterar o método load() do interceptor... daí dado o nome e o tipo, ele procura o id na requisição e faz o load no finalzinho.
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 13:19:08
|
thiagobaptista
JavaChild
![[Avatar]](/images/avatar/45a5c0d5cf3b363b1c4985f161fbbd98.jpg)
Membro desde: 09/07/2010 15:43:03
Mensagens: 131
Localização: Cidade Maravilhosa / RJ
Offline
|
Oi Lucas! Que bom que você gostou!
Então, a questão é que eu estou com dificuldade para compreender como exatamente o método intercept() da classe ParameterLoaderInterceptor age.
As alterações parciais que eu fiz nesse método ficaram assim (pendendo refatorar):
Faltaria criar o tal método loadWithFactory(). Minha dúvida agora é entender o método como um todo e como obter a anotação para então dar um "antotacao.getValue()" e pegar o .class da classe-fábrica e instanciá-la usando reflection.
|
Thiago Baptista - \\//
contato@thiagobaptista.com
Desenvolvedor Web
Analista Desenvolvedor Java Pleno - DBA Engenharia de Sistemas
Usuário Linux #492635
Você sabe que Java é uma plataforma divertida quando você cria um arquivo Guerra, que referencia uma Jarra, dentro de uma Orelha.
"A vida é bela; que as futuras gerações a livrem de todo mal, opressão e violência, e possam desfrutá-la em sua plenitude..."
-- Leon Trotsky |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2012 14:31:27
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
o intercept é o método do Interceptor normal do vraptor
para pegar o valor da annotation, basta usar o iterable loadsWithFactory:
talvez seja melhor criar outro interceptor ao invés de modificar o existente... assim a gente separa o @Load do @LoadWith.
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/01/2012 08:05:40
|
wpivotto
Thread.start()
Membro desde: 04/01/2010 14:44:33
Mensagens: 34
Offline
|
Eu criei uma solução aqui https://gist.github.com/1710097
Ela mantem o padrão do Vraptor nos controllers (anotação @Load) e a seleção dos loaders é feita via anotação @LoadedBy nos models. Acho que assim fica mais limpo.
Caso o modelo não seja anotado ele delega para o loader default.
Algo mais ou menos assim:
e o loader
e no controller:
testei aqui e funciona, da pra melhorar bastante, mas é um caminho...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/01/2012 09:49:25
|
thiagobaptista
JavaChild
![[Avatar]](/images/avatar/45a5c0d5cf3b363b1c4985f161fbbd98.jpg)
Membro desde: 09/07/2010 15:43:03
Mensagens: 131
Localização: Cidade Maravilhosa / RJ
Offline
|
Bacana sua solução, wpivotto! Realmente é melhor do que do jeito que eu imaginei, diminue bem o acoplamento entre as classes e mantém a necessidade de somente uma anotação no parâmetro.
Só sugiro renomear os pacotes, pra manter o padrão do vRaptor.
|
Thiago Baptista - \\//
contato@thiagobaptista.com
Desenvolvedor Web
Analista Desenvolvedor Java Pleno - DBA Engenharia de Sistemas
Usuário Linux #492635
Você sabe que Java é uma plataforma divertida quando você cria um arquivo Guerra, que referencia uma Jarra, dentro de uma Orelha.
"A vida é bela; que as futuras gerações a livrem de todo mal, opressão e violência, e possam desfrutá-la em sua plenitude..."
-- Leon Trotsky |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/01/2012 10:07:23
|
wpivotto
Thread.start()
Membro desde: 04/01/2010 14:44:33
Mensagens: 34
Offline
|
thiagobaptista wrote:Bacana sua solução, wpivotto! Realmente é melhor do que do jeito que eu imaginei, diminue bem o acoplamento entre as classes e mantém a necessidade de somente uma anotação no parâmetro.
Só sugiro renomear os pacotes, pra manter o padrão do vRaptor.
Concordo... foi somente de teste mesmo
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2012 20:11:45
|
thiagobaptista
JavaChild
![[Avatar]](/images/avatar/45a5c0d5cf3b363b1c4985f161fbbd98.jpg)
Membro desde: 09/07/2010 15:43:03
Mensagens: 131
Localização: Cidade Maravilhosa / RJ
Offline
|
Então... fechou essa parada? Você irá implementar isso no vRaptor?
|
Thiago Baptista - \\//
contato@thiagobaptista.com
Desenvolvedor Web
Analista Desenvolvedor Java Pleno - DBA Engenharia de Sistemas
Usuário Linux #492635
Você sabe que Java é uma plataforma divertida quando você cria um arquivo Guerra, que referencia uma Jarra, dentro de uma Orelha.
"A vida é bela; que as futuras gerações a livrem de todo mal, opressão e violência, e possam desfrutá-la em sua plenitude..."
-- Leon Trotsky |
|
|
 |
|
|