Olá desenvolvedores, neste tutorial adicionaremos o CDI – Contexts and Dependency Injection ao nosso projeto JSF. O CDI é uma especificação integrada a plataforma JAVA a partir do JAVA EE 6, ela foi criada para reduzir o acoplamento entre as classes dando mais flexibilidade ao projeto.

No entanto, antes de começar a utilizar o recurso é preciso fazer a declaração das dependências no arquivo pom.xml para que o download das bibliotecas weld-servlet e jandex, seja realizado. Para saber mais sobre as configurações necessárias para a ativação do CDI, basta clicar neste link para ser redirecionado ao tutorial “CDI – CONFIGURANDO O PROJETO”.

ADICIONANDO AS ANOTAÇÕES DO CDI

Se estivéssemos começando um projeto do zero, já ativaríamos o CDI logo no início.

No entanto, como estamos adicionando a especificação em um projeto já pronto, teremos que proceder com a troça das anotações. E começaremos pelo centro do projeto.

O “centro do projeto” é a classe responsável pelas transações de persistência do projeto. Em nosso projeto, o centro é a classe JPAUtil.java.

Nesta classe a primeira alteração será a remoção do modificador de acesso static adicionado porque estabelecemos um padrão “Singleton”. Após isso criaremos um construtor onde moveremos para dentro do seu escopo o trecho de código já existente, correspondente ao EntityManagerFactory.

Desse modo, assim que o projeto for iniciado junto com ele a configuração do JPA será iniciada também.

Esta configuração deverá ser realizada uma única vez e para isso basta preceder a assinatura da classe com a anotação @ApplicationScoped do pacote javax.enterprise.context.

Ainda na classe JPAUTIL, a classe responsável pela criação do EntityManager também deverá ser anotada, neste caso com o @Produces do pacote javax.enterprise.inject. Assim ele irá produzir as EntityManager e não será preciso chamá-las manualmente. A classe deverá ser anotada também com o @RequestScoped do javax.enterprise.context.

CORRIGINDO O DAOGENERIC

Agora na classe DaoGeneric, para que a injeção de dependência possa funcionar é preciso “injetar” o JPAUTIL onde ele será usado. Dessa forma, todas as classes que irão usar a injeção de dependência do JPAUtil deverá ser anotada com @Named do pacote javax.inject. No escopo da classe faz-se a injeção de dependência, anotada com o @Inject. Injete também a própria classe JPAUtil precedida da mesma anotação.

Em todos os métodos exclua as linhas de código demonstradas abaixo, onde chamávamos o EntityManager na mão, porque a partir de agora a referência virá do objeto. E igualmente remova também a parte de close() porque a responsabilidade agora será do framework.

EntityManager entityManager = JPAUtil.getEntityManager();
entityManager.close()

Como a classe JPAUtl foi injetada também, chamaremos o objeto, faça como mostra a linha de código abaixo.

Object id = jpaUtil.getPrimayKey(entidade)

CORRIGINDO O FILTERAUTENTICACAO

Na classe FilterAutenticacao será preciso injetar também o JPAUtil anotada do @Inject. Do mesmo modo como procedemos no DaoGeneric chamaremos o EntityManager por meio do objeto.

CORRIGINDO AS INTERFACES DAO

Na interface IDaoLancamentoImpl usaremos a injeção de dependência do JPAUtil e anotaremos a assinatura da classe com @Named do pacote javax.inject. E exatamente igual faça na classe IDaoPessoaImpl.

No escopo da classe declara-se a injeção de dependência anotada com o @Inject.

@Inject
private EntityManager entityManager;

Em todos os métodos exclua as linhas de código demonstradas abaixo, onde chamávamos o EntityManager na mão, porque a partir de agora a referência virá do objeto. E igualmente remova também a parte de close() porque a responsabilidade agora será do framework.

EntityManager entityManager = JPAUtil.getEntityManager();
entityManager.close()

MANAGEDBEAN

A assinatura da classe deverá ser anotada com o @Named que é o equivalente do CDI ao @ManagedBean. No lugar de name declare o value passando o mesmo nome, “pessoaBean”. E quanto a anotação @ViewScoped, trocaremos a anotação atual que pertence ao pacote javax.faces.bean pela anotação de mesmo nome, porém, pertencente ao pacote javax.faces.view. Igual procedimento deverá ser feito na classe LancamentoBean.

O ManagedBean está usando injeção de dependência, assim, não podemos mais criar os objetos na mão, porque desse modo toda a injeção de dependência será perdida e um NullPointerException será gerado. O que precisamos fazer é apenas declará-los e anotá-los com o @Inject. Igual procedimento também deverá ser feito na classe LancamentoBean.

EM POUCAS PALAVRAS

Neste tutorial fica evidente a importância de planejar o projeto antes de colocar a mão na massa. Porque dependendo do tamanho e complexidade do projeto realizar mudanças da mesma natureza qual fizemos neste tutorial é praticamente impossível. E isso sem levar em conta o risco de que algumas funcionalidades do projeto deixem de funcionar.

Assim, é na fase de planejamento que você escolherá qual arquitetura atenderá melhor as necessidades da sua aplicação. Pois como pôde notar, realizar determinadas mudanças no meio do projeto, além de ser um processo trabalhoso implica em um precioso tempo empenhado a uma tarefa que poderia ter sido evitada com algumas horas dedicadas ao planejamento da sua aplicação.