CDI: Não use @Inject e @ManagedBean nas suas classes

Algumas semanas atrás tive uma experiência bem estressante e chata ao misturar as anotações do JSF com as anotações do CDI. Apesar de saber que EM TEORIA eu não deveria fazer isso eu acabei fazendo e percebendo o problema NA PRÁTICA.

O problema ocorria quando minha página processava uma EL (Expression Language) que apontava para um managed bean anotado com @ManagedBean e tinha suas dependências injetadas pelo CDI através da anotação @Inject… nesse momento a injeção não ocorria. Sendo mais específico, simplesmente o container (qual deles? JSF ou CDI?) injetava null no atributo da classe. O código era semelhante a este:

@ManagedBean
public class AlunosBean {

    @Inject
    private AlunosDao dao;

}

A coisa fica ainda mais feia quando misturava os escopos do CDI com o escopos do JSF. Imagina um managed bean sendo instanciado trocentas vezes? Pois é…

Depois de muito ler e discutir com amigos que sacam mais de CDI do que eu, como o Raphael Lacerda e Daniel Cunha, eu percebi que NÃO era uma boa prática misturar as anotações. Para você entender mais a fundo do que estou falando eu bloguei no blog da TriadWorks sobre isso. Você pode ler o post completo no link abaixo:

>>> NÃO misture anotações do JSF com as anotações do CDI

O post fala um pouco sobre meu problema e de quebra ensina como você pode migrar seus managed beans do JSF para beans do CDI. Onde com certeza essa é a melhor escolha que você poderia tomar.

Enfim, uma experiência interessante que quis compartilhar.

Conversores e validadores acessando beans do Spring

Não é incomum ter conversores ou validadores do JSF que precisem acessar o banco de dados ou mesmo outros recursos do sistema, como um webservice, por exemplo. A verdade que esta prática é muito utilizada quando implementamos nossos entity converters. Quando trabalhamos com Spring ou CDI nós temos todo o poder de um container de IoC/DI, o que nos possibilita injetar beans gerenciados em nossas classes ou mesmo managed beans. Contudo a especificação do JSF 2.x ainda não tem um suporte decente de DI para conversores, validadores e alguns outros componentes internos do framework.

Para contornar essa limitação, podemos gerenciar os conversores do JSF com o container do Spring ou CDI. Dessa forma ganhamos a possibilidade de injetar qualquer bean dentro dos conversores e aplicar qualquer recurso extra do container, segurança, caching, controle transacional etc. Para saber mais detalhes sobre como injetar beans em seus validadores ou conversores, não deixe de ler o último post de 2014 no blog dos desenvolvedores da TriadWorks.