Para você: EntityConverter para qualquer entidade e tipo de Id.  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
Flavio Almeida
Java Ninja
[Avatar]

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
Ataxexe
JavaEvangelist
[Avatar]

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
Flavio Almeida
Java Ninja
[Avatar]

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
Flavio Almeida
Java Ninja
[Avatar]

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
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.
Flavio Almeida
Java Ninja
[Avatar]

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
rponte
JavaEvangelist
[Avatar]

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/
[WWW]
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.
Flavio Almeida
Java Ninja
[Avatar]

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
Flavio Almeida
Java Ninja
[Avatar]

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
Ataxexe
JavaEvangelist
[Avatar]

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
Flavio Almeida
Java Ninja
[Avatar]

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
Flavio Almeida
Java Ninja
[Avatar]

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
Flavio Almeida
Java Ninja
[Avatar]

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
HarryPodre
Thread.start()
[Avatar]

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
[Email] [MSN]
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team