| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2010 08:44:52
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Depois de ter encontrado a solução SimpleEntityConverter em http://www.rponte.com.br/tag/entity-converter/, resolvi melhorá-la, deixando-a ainda mais genérica. O próprio autor diz: "(...) É possível estende-las e até melhora-las, você é livre para isso, e dependendo da tua necessidade provavelmente será o melhor caminho, só não deixe de contribuir com o código para a comunidade (...).
1 - Não há necessidade de implementar a interface BaseEntity
2 - O id da classe pode ser String, Integer, etc. e não apenas Long como em SimpleEntityConverter, pois a classe identifica o retorno pela anotação @Id. Essa foi uma das motivações que me levaram a melhorar SimpleEntityConverter, pois algumas entidades de nossos sistemas não possuem id do tipo Long, mas String.
Registre o converter em faces-config.xml:
<converter>
<converter-id>entityConverter</converter-id>
<converter-class>net.metha.jsf.converter.EntityConverter</converter-class>
</converter>
Use e abuse:
<h:selectOneMenu id="comboRestaurantes"
value="#{consumoMB.restauranteOperacao}" required="true"
label="Restaurante" converter="entityConverter">
10/02/2011 -> RETIFICANDO: O CÓDIGO ACIMA NÃO É THREADSAFE, USAR DESTA FORMA:
Esta solução está sendo usada em ambiente de produção.
Atenciosamente,
Flávio Henrique de Souza Almeida
This message was edited 9 times. Last update was at 10/02/2011 09:31:27
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2010 09:17:43
|
Ataxexe
JavaEvangelist
![[Avatar]](/images/avatar/8ed02495f7499c010a3b22c830438ec2.jpg)
Membro desde: 11/10/2007 15:34:17
Mensagens: 418
Localização: Brasília
Offline
|
Bacana. Pro pessoal que usa o JBoss Seam isso não é necessário. Basta usar a tag s:convertEntity. Mais uma coisinha: com @EmbeddedId sua solução não funcionará, bem como subclasses cujo id esteja na superclasse.
This message was edited 1 time. Last update was at 06/10/2010 09:20:01
|
Marcelo Guimarães
https://github.com/ataxexe
http://sourceforge.net/projects/trugger
http://www.youtube.com/user/ataxexe
http://www.flickr.com/photos/ataxexe |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2010 15:43:04
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Obrigado pelas sugestões.
Estamos cientes do s:converEntity do Seam, mas como a versão 2.0 não suporta CDI (out-of-the-box), estamos aguardando a versão 3.0.
Sobre o @EmbeddedId: acredito que eu não tenha dificuldade em adicionar esta funcionalidade.
Sobre herança: farei a alteração.
This message was edited 1 time. Last update was at 06/10/2010 16:13:40
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2010 16:12:31
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Suporte à herança adicionado.
This message was edited 7 times. Last update was at 07/10/2010 00:54:07
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/10/2010 19:56:53
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Isso é um dos piores erros que um programador pode fazer quando trabalha com exceptions.
http://today.java.net/article/2006/04/04/exception-handling-antipatterns
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/10/2010 00:30:38
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Podemos gravar em um log essas exceções ou fazer com que getId() lance uma exceção personalizada (EntityConverterException).
This message was edited 2 times. Last update was at 07/10/2010 00:49:22
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/10/2010 01:21:06
|
rponte
JavaEvangelist
![[Avatar]](/images/avatar/37a90a1fe7512a804347fa3e572c6b86.png)
Membro desde: 18/02/2008 10:06:25
Mensagens: 413
Offline
|
Olá Flavio,
Muito bacana a solução e fico feliz que você tenha disponibilizado a mesma no GUJ. Acredito que não exista lugar melhor para isso!
Como já é sábido por você, o JBoss Seam se utiliza dessa mesma solução, através do s:entityConvert, e provavelmente o código dele tenha coisas bem interessantes para se observar se tratando de problemas comuns, como o problema de herança já corrigido por você.
Eu havia pensado nessa solução também, mas ela acabou ficando fora do post. Contudo, o mais interessante de tudo isso são estes tipos de iniciativas em compartilhar conhecimento e código com a comunidade.
Enfim, como o garcia-jj comentou, melhore o tratamento de exceções, pois ignora-las é uma má prática. E claro, se possível disponibilize o código no GitHub
Um abraço e parabéns novamente.
|
Rafael Ponte
http://www.rponte.com.br/ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/10/2010 10:35:42
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Usar o github é excelente, pois muitas pessoas podem fazer um fork e contribuir.
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/10/2010 10:52:38
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Adicionei suporte à anotação @EmbeddedId e corrigi um problema na hierarquia de classes.
This message was edited 3 times. Last update was at 07/10/2010 10:56:10
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2010 11:37:18
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Estamos usando em produção EntityConverter e até agora não tivemos problemas.
A diferença básica entre EntityConverter e o s:ConvertEntity do Seam é a seguinte:
1 - s:ConvertyEntity obtém o id da entidade e realiza a procura no banco de dados utilizando JPA. Eles resolvem o problema da unidade de persistência, permitindo que o usuário defina este atributo na própria tag quando necessário. Acho essa solução interessante, ficando ainda melhor quando temos um cache de segundo nível como ehcache.
2- EntityConverter, assim como SimpleEntityConverter, altera o estado do componente no lado do servidor. A vantagem é de não precisamos acessar o EntityManager dentro do converter, mas há um custo de processamento, que em nossos sistemas, até o momento, é imperceptível.
Eu poderia alterar o código e usar a mesma estratégia do s:ConvertEntity (o código de infraestrutura já permite isso), mas se isso fosse necessário, eu utilizaria o s:ConvertEntity e não o EntityConverter.
O que eu gostaria deixar bem claro aqui é que EntityConverter foi criado pensando nas aplicações que desenvolvo, desta forma, será necessário que cada um avalie qual tipo de conversor de entidade utilizar.
Abraço
This message was edited 2 times. Last update was at 13/10/2010 09:36:31
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/10/2010 21:46:45
|
Ataxexe
JavaEvangelist
![[Avatar]](/images/avatar/8ed02495f7499c010a3b22c830438ec2.jpg)
Membro desde: 11/10/2007 15:34:17
Mensagens: 418
Localização: Brasília
Offline
|
Muito bom, meus parabéns! Tanto pelas melhorias como pela iniciativa de compartilhar suas ideias conosco.
|
Marcelo Guimarães
https://github.com/ataxexe
http://sourceforge.net/projects/trugger
http://www.youtube.com/user/ataxexe
http://www.flickr.com/photos/ataxexe |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/10/2010 11:07:01
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Ataxexe sugeriu a utilização de uma biblioteca de reflexão para deixar o código mais legível. A biblioteca escolhida foi a Trugger 2.7.0 que pode ser baixada em:
http://sourceforge.net/projects/trugger/
O método getId() foi reescrito com base no código enviado pelo colega. Reparem que não é mais necessário o método getHierarquiaDeClasses() nem o parâmetro da classe.
Para o código ficar ainda mais rápido, será necessário limar o método getClazz (evoca EL), mas eu ainda preciso dele no método getAsString() devido a necessidade de sabermos qual a classe do objeto que chega até o converter para podermos gravá-lo dentro do map. Como ainda estou conhecendo a biblioteca trugger, acredito que ela tenha a chave para esta resposta.
Ataxexe, você vê alguma solução?
Segue o código alterado. Não esqueçam de adicionar trugger-2.7.0.jar
OBS: eu fiz um teste premilinar e funcionou. Amanhã, farei outro teste colocarei em produção.
This message was edited 4 times. Last update was at 12/10/2010 14:13:12
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/10/2010 09:39:59
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
O desempenho está muito bom.
Coloquei mais um sistema nosso utilizando esta classe. Para os managedBeans em escopo de visão, o desempenho é melhor ainda.
This message was edited 1 time. Last update was at 15/10/2010 09:05:11
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/11/2010 08:24:14
|
Flavio Almeida
Java Ninja
![[Avatar]](/images/avatar/87064c139c707be62972ced58b6c5f9f.jpg)
Membro desde: 06/11/2009 14:01:46
Mensagens: 251
Localização: Niterói, RJ
Offline
|
Este converter não funciona com rich:combobox. Por quê? Porque esta tag não usa selectedItens internamente, ou seja, é derivada da suggestionbox. Parece que isso foi resolvido no richfaces 4.
Assim que eu realizar o teste, eu posto aqui.
Abraço
|
"o único homem educado é o homem que aprendeu a aprender" - Carl R. Rogers |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/01/2011 17:47:02
|
HarryPodre
Thread.start()
![[Avatar]](/images/avatar/e988d81b705df34d7735e84bdd0220f9.jpg)
Membro desde: 23/10/2007 14:59:41
Mensagens: 30
Offline
|
Boa tarde,
Estou usando este converter mas não consigo obter o resultado esperado.
No método getAsObject() recebo um null. Debuguei o método getAsString() e os objetos são inseridos no map normalmente, mas quando preciso obter no método getAsObject() recebo um null.
Segue o código:
O registro do converter no faces-config:
Página:
Alguma idéia?
Preciso colocar algo mais do meu código?
Atte.
Gustavo Belloni Metzner
|
|
|
 |
|
|