JSF 2 como fazer um converter que faz consulta no banco
8 respostas
R
rafaelbtz
Salve Guj,
Estou com o seguinte problema, preciso criar um converter no JSF 2.0, até ai tanquilo.
Mas ele faz consultas no Banco de Dados e eu não consigo injetar o EntityManager com a anotação @PersistenceContext.
Eu estava com o mesmo problema.
Quando se trabalha com converter, tenha em mente que a interface Web-Page somente trabalha com valores em String. Assim o Converter opera traduzindo do tipo String para o o tipo do Objeto e do tipo Objeto para String, por isso os métodos getAsObject e getAsString.
Então, no método getAsString, deve-se retorna um String da chave primária da classe persistida.
Já o método getAsObject deve pegar o valor String, coverter para Long (se for o caso de um identificador Long), executar o método de busca do DAO e retornar o Objeto.
Provavelmente você deve estar implementando um <h:selectOneMenu>, mas especifica melhor o seu problema que eu terei prazer em ajudá-lo, colocando códigos de exemplo.
Dá uma olhada nesse link abaixo, ele explica direitinho como fazer com JPA. http://digitaljoel.wordpress.com/2010/01/11/jsf-2-custom-converter/
Abraços
I
ibotirama
Oi, rafaelbtz gostaria de saber se você conseguiu injetar o seu dao no converter, estou com o mesmo pro eu uso o Spring 3.0.5
Titvs, o seu exemplo não serve porque o problema pelo que eu entendi é injetar um “repository” ou DAO no Converter, e não a conversão simples de tipo.
R
rafaelbtz
ibotirama:
Oi, rafaelbtz gostaria de saber se você conseguiu injetar o seu dao no converter, estou com o mesmo pro eu uso o Spring 3.0.5
Titvs, o seu exemplo não serve porque o problema pelo que eu entendi é injetar um “repository” ou DAO no Converter, e não a conversão simples de tipo.
Injetar eu não consegui não.
Mas eu dei um outro jeito, eu tive que mudar os esquemas de toda aplicação. Eu estou utilizando aquele famoso HibernateUtils que abre a Session num filtro e coloca essa session num ThreadLocal assim a Session do hibernate fica acessível a toda aplicação (deve existir algum nome bonito de um Design Pattern pra isso que fiz, mas eu não sei o nome). Se você puder fazer essas alterações na sua aplicação faça pq funciona, mas injetar o Dao ou um EntityManager num Conversor isso eu não consegui.
T
titvs
Eu também estou usando o HibernateUtil e está funcionando que é uma beleza sem a necessidade de injetar o Dao no entity.
Abraços
R
rafaelbtz
titvs:
Eu também estou usando o HibernateUtil e está funcionando que é uma beleza sem a necessidade de injetar o Dao no entity.
Abraços
Mas eu tenho também um outro projeto com EJB 3 com a transação gerenciada pelo container e esse não teve jeito, porque não dava pra usar uma classe Utils com EntityManager no ThreadLocal, ai não teve jeito tive que usar propriedades no Managed bean com Long e id do objeto ao invés de objetos completos obtidos a partir do DAO no conversor.
I
ibotirama
Como eu uso o spring e meu DAO está anotado com @Repository e @Scope(“singleton”) então no momento do conversor já está na memória, aí eu faço isso :
Deu certo, mas depois eu desisti, e tentei outras coisas, porque no getAsString o meu Object só vinha como nulo rs, eita erros bizarros.
I
ibotirama
Se tiver NetBeans instale um exemplo chamado ScrumToys que ele também tem uma outra alternativa, o Alberto Lemos da Globalcode que criou, lá ele faz um cache das opções, e depois recupera :
/** * @author Dr. Spock (spock at dev.java.net) */@FacesConverter(forClass=Project.class)publicclassProjectConverterimplementsConverter{privatestaticMap<Long,Project>cache=newHashMap<Long,Project>();publicObjectgetAsObject(FacesContextcontext,UIComponentcomponent,Stringvalue){if(value==null&&value.equals("0")){returnnull;}try{returncache.get(Long.parseLong(value));}catch(NumberFormatExceptione){thrownewConverterException("Invalid value: "+value,e);}}publicStringgetAsString(FacesContextcontext,UIComponentcomponent,Objectobject){Projectproject=(Project)object;Longid=project.getId();if(id!=null){cache.put(id,project);returnString.valueOf(id.longValue());}else{return"0";}}}
D
danilo.akamine
Com Seam Faces você consegue.
além de poder utilizar a anotação @Inject do CDI, você consegue até usar @EJB pra injetar EJB’s.
Agora, se você estiver precisando de um EntityManager no Converter para simplesmente trafegar o objeto da View para o Managed Bean, pode utilizar uma tag do Seam Faces que faz isso para você automaticamente com qualquer objeto.
É só utilizar a tag <s:objectConverter />