Olá desenvolvedores, no tutorial de hoje iremos adicionar o CDI – Contexts and Dependency Injection, aos combos dependentes, no entanto, esbarramos em um problema. Antes, porém, lembrando que combos dependentes se referem aos campos dos Estados, onde, a partir da seleção de um Estado a lista de cidades correspondentes é listada em outro campo.

Mas como mencionado, há um problema, a implementação do “converter” não aceita a injeção de dependência do CDI. O “converter” faz com que quando o código do Estado selecionado for da tela para o servidor, o objeto seja carregado no banco de dados e então retornado.

A solução para contornar este problema foi a criação de um método estático para que seja possível acessar o CDI dentro do “converter”. Esta solução implicará em algumas alterações no código, que faremos neste tutorial.

ALTERAÇÕES NO JPAUTIL

Na classe JPAUtil o primeiro passo será remover a palavra reservada static do EntityManagerFactory. Depois, remova o número 1(um) adicionado a um dos métodos EntityManager() adicionado para distingui-lo dos outros e delete todo o método estático EntityManager().

private static EntityManagerFactory factory = null;

PACKAGE CONVERTER

Agora na classe CidadesConverter do pacote br.com.converter, é preciso proceder com uma alteração no EntityManager que está sendo controlado pelo CDI dentro do escopo de contexto do CDI. Assim, o EntityManager que recebia o JPAUtil.getEntityManager() irá agora receber o CDI do pacote javax.enterprise.inject.spi, e a partir do contexto de execução dele, selecionar o EntityManager. E com get() o objeto que está no escopo de execução será retornado.

Dessa forma, não será mais necessário abrir e iniciar uma transação, visto que agora temos o EntityManager sendo buscado no escopo do CDI e sendo por ele gerenciado. Assim, as linhas de código correspondentes podem ser deletadas.

Na classe EstadoConverter do mesmo pacote proceda exatamente com a mesma modificação.

Ao concluímos todas estas alterações, os imports javax.peristence.EntityTransaction e br.com.jpautil.JPAUtil não serão mais necessários. Desse modo, com a combinação de teclas [CTRL + SHIFT + O], automaticamente a IDE Eclipse organizará o código e excluirá os imports desnecessários.

MANAGEDBEAN

No ManagedBean, PessoaBean, onde obtínhamos o JPAUtil de forma direta um erro foi apontado. O que precisamos fazer é injetar o JPAUtil anotado do @Inject, e assim, substituir o JPAUtil onde ele é chamado de forma direta.

@Inject
private JPAUtil jpaUtil;

Assim, como mencionado, nos métodos salvar() e editar() respectivamente substituiremos o JPAUtil onde ele é chamado de forma direta pelo objeto jpaUtil.

No entanto, na assinatura do método edtitar() como é preciso retornar uma String, trocaremos o void por String. No final ele fará o retorno para a mesma tela.

public String editar(){
return "";
}

INTERFACE IDAO

Na interface IDaoPessoaImpl também deveremos proceder com uma alteração onde usávamos o EntityManager estático. Uma vez que pegaremos diretamente do EntityManager que está sendo injetado. Na verdade, a alteração implica apenas em excluir todas as linhas de código abaixo.

EM POUCAS PALAVRAS

Após esta implementação todo o projeto está configurado para usar o CDI, sendo então gerenciado por ele. Embora tenhamos aplicado um recurso estático na implementação do “converter”, trata-se de um recurso do framework que obtém o objeto que está sendo gerenciado pelo CDI, deixando o disponível para ser usado, onde antes não havia possibilidade.