Use CDI no seu próximo projeto Java
Postado em 23. mai, 2012 por Sérgio Lopes em Inovação, Java
CDI é a especificação do Java EE 6 que cuida da parte de injeção de dependências. E, além de ser oficial e estar incluída em todos os servidores de aplicação, é tão boa e produtiva que já tem gente questionando o papel do Spring nos dias de hoje.
O CDI se encaixa muito bem em todo tipo de projeto Java. Se você usa JSF2, usar CDI é natural, como mostramos no nosso curso FJ-26. Mas mesmo para aplicações Web simples, com apenas Servlets, o CDI é um grande ganho.
Habilitando CDI
Habilitar o CDI no projeto é muito simples. Se você já está usando um servidor Java EE 6, basta criar um arquivo vazio chamado beans.xml na pasta META-INF do seu projeto (ou WEB-INF num projeto web). Esse é um simples arquivo de marcação e apenas sua presença já faz com que o servidor habilite o suporte a CDI e escaneie suas classes automaticamente.
Se você estiver usando Tomcat, Jetty ou outro servidor antes do Java EE 6, ainda é possível habilitar o CDI copiando e configurando o JAR de alguma de suas implementações. Vamos usar o Weld, a implementação de referência e a mais usada (já embutida no JBoss e no Glassfish).
No caso do Tomcat, os passos de configuração são:
- Baixar a última versão do Weld no site dele
- Copiar o weld-servlet.jar pra pasta WEB-INF/lib
- Criar um arquivo META-INF/context.xml
- Acrescentar as configurações do Weld no web.xml
Feito isso, basta criar o tal arquivo META-INF/beans.xml vazio no projeto.
Tudo são beans
Com o CDI habilitado, praticamente todas as classes do projeto são consideradas managed beans e, portanto, passíveis de injeção e de serem injetadas. Podemos usar com CDI toda classe pública com um construtor público padrão ou algum que receba parâmetros e esteja anotado com @Inject.
Aliás, essa anotação @Inject é a base de todo o CDI: é ela quem permite a injeção de dependências e devemos usá-la nos pontos que queremos injeção automática, sejam construtores, setters ou atributos privados.
Essa anotação, embora usada com CDI, faz parte na verdade de uma outra especificação, a JSR330. Essa é uma especificação bastante simples, com apenas algumas anotações relacionadas à injeção de dependências no pacote javax.inject. A ideia é ter um conjunto básico de recursos para injeção a serem suportados em todos os frameworks do tipo – além do CDI, Spring, Google Guice, PicoContainer e outros frameworks suportam essas anotações.
Primeira injeção
Imagine que temos uma classe ProdutoDAO que cuida de persistir objetos Produto:
public class ProdutoDAO {
public void adiciona(Produto produto) {
// ... implementação
}
}
Essa classe simples, sem nenhuma configuração particular, pode ter objetos injetados em qualquer outro ponto da aplicação. Basta usar a anotação @Inject:
public class ProdutoController {
@Inject private ProdutoDAO dao;
public String inserir() {
Produto p = // ...
dao.adiciona(p);
return "Produto adicionado!";
}
}
Poderíamos também ter feito a própria classe ProdutoDAO receber um EntityManager da JPA para trabalhar com a persistência:
public class ProdutoDAO {
@Inject private EntityManager manager;
public void adiciona(Produto produto) {
manager.persist(produto);
}
}
Produção de objetos
Sempre que encontrar um ponto de injeção, o CDI vai tentar instanciar a classe sendo referenciada. No caso do DAO anterior, ao criá-lo, o CDI vai tentar dar new em EntityManager.
Mas EntityManager, assim como vários outros objetos, não pode ser criado tão facilmente assim. A criação de um EntityManager exige a chamada do método createEntityManager no EntityManagerFactory correspondente. É um objeto com um processo de fabricação particular.
Nos Design Patterns, sempre que encontramos esse tipo de cenário, criamos uma Factory para aquele objeto. É um simples método que encapsula a criação não-trivial do objeto em questão. Com CDI é a mesma coisa.
Vamos criar um método em uma classe qualquer do sistema que cuide da produção de objetos EntityManager. E podemos indicar ao CDI que queremos que ele use esse método sempre que alguém pedir a injeção de um EntityManager. Fazemos isso com a anotação @Produces:
public class ProdutorEntityManager {
private static EntityManagerFactory factory = Persistence.createEntiyManagerFactory("default");
@Produces
public EntityManager criaEntityManager() {
return factory.createEntityManager();
}
}
Agora, todos os pontos de injeção que precisarem de EntityManager irão invocar essa fábrica anotada com @Produces.
Escopos
Mas quantos EntityManagers vamos criar com o código acima? Por padrão, toda dependência no CDI possui um escopo chamado Dependant. Isso é: será instanciada tantas vezes quanto quem estiver chamando for. Certamente não é o que queremos com nosso EntityManager.
É usual criar um EntityManager por requisição em uma aplicação Web. Podemos indicar isso apenas anotando o método produtor com @RequestScoped:
public class ProdutorEntityManager {
@Produces @RequestScoped
public EntityManager criaEntityManager() {
// ...
}
}
Agora, um novo EntityManager será criado associado a um request. Se mais de uma classe pedir um EntityManager durante o mesmo request, a mesma instância será passada, evitando desperdício de recursos. Outros escopos comuns são @SessionScoped e @ApplicationScoped.
Mais: como definimos o escopo da dependência, temos agora uma visão clara de seu ciclo de vida. O objeto durará apenas um request, e será descartado quando o request acabar.
O CDI nos deixa, inclusive, executar algo na fase de descarte da dependência, ao final da requsição. No nossa caso, será muito útil para chamar o close no EntityManager. Basta criar um método que receba a dependência a ser descartada e anotar o parâmetro com @Disposes:
public class ProdutorEntityManager {
@Produces @RequestScoped
public EntityManager criaEntityManager() {
// ...
}
public void finaliza(@Disposes EntityManager manager) {
manager.close();
}
}
O método finaliza será chamado automaticamente pelo CDI ao final do request e fará o fechamento do EntityManager.
Use CDI no seu próximo projeto
O CDI é extremamente completo e poderoso. Esse artigo mostrou apenas o básico e o início do trabalho. Mas seu container de injeção typesafe com anotações simples e produtivas tem muitos outros recursos. Mostrei várias funcionalidades do CDI em uma palestra no JavaOne Brasil que você pode acompanhar a seguir:
Aqui mesmo no blog já mostramos como fazer a produção de dependências de tipos genéricos. Além disso, há recursos como qualifiers, interceptadores, decorators, eventos e muito mais. Mostramos várias dessas funcionalidades no curso FJ-26 da Caelum, inclusive com o JBoss Seam 3, uma ótima companhia para o CDI.
E você, o que acha do CDI? Tem usado em seus projetos?
Sérgio Lopes (Google+)
Mais sobre o autor
55 Respostas para “Use CDI no seu próximo projeto Java”
Trackbacks/Pingbacks
-
-
maio 31, 2012
[...] fora de um servidor de aplicação. Poderiamos utilizar o Weld para nos fornecer injeção padrão JavaEE por meio do CDI, permitindo inclusive customizar a criação dos objetos. O uso do Spring, entretanto, torna mais [...]
-
-
setembro 19, 2012
[...] CDI é a especificação para Injeção de Dependência (JSR-299). Surgiu também com o JavaEE 6 e foi prontamente adotada pela comunidade, inclusive integrando com linguagens como Ruby (projeto TorqueBox). Já teve inclusive alguns estudos para identificar o desempenho de aplicações que usam a API e concluem como a implementação de referência Weld evoluiu e ainda tem a evoluir. Com a especificação conseguimos algumas manipulações bem avançadas como, por exemplo, injeção de dependência para objetos genéricos. [...]
-
-
dezembro 17, 2012
[...] falamos de CDI aqui no blog da Caelum, tanto numa introdução pra você começar a usar o CDI quanto em tópicos mais avançados. E recentemente até abordei o tema em uma palestra sobre CDI no [...]
-
-
dezembro 26, 2012
[...] Use CDI no seu próximo projeto JavaPor Sérgio Lopes, em 23/05 [...]
-
-
abril 2, 2013
[...] inicial do VRaptor com CDI. Durante o desenvolvimento tivemos que usar bastante funcionalidades dessa poderosa especificação. O desafio que tivemos foi o de manter a compatibilidade em relação ao construtor com [...]
-
-
maio 7, 2013
[...] aspectos operacionais da IDE. Por exemplo, os recursos do Eclipse agora usufruem do poder do CDI (Context and Dependency Injection) para serem injetados e executados. Isso apresenta uma performance melhor e um código mais limpo [...]
ASSINE NOSSO RSS
Caio Ribeiro Pereira
23. mai, 2012
Parabéns pelo post!
Nunca usei CDI, creio que esses exemplos já ajudarão e muito na hora de criar uma simples webapp com ele, achei ele bem mais prático que o Spring.
Sabe me informar quando devo usar CDI e quando devo usar Spring pra injeção de depedências?
Tipo vantagens e desvantagens de cada um?
Welington Veiga
23. mai, 2012
Sou um fã do Spring, mas vou procurar conhecer o CDI, embora o Spring forneça muito mais que DI, em projetos menores pode-se fazer uso desse recurso sem necessidade de incorporar todo o framework.
Parabéns pelo post.
Felipe Caparelli
23. mai, 2012
Meus parabéns Sérgio! Didática fantástica para explicar o CDI e sua aplicação sem termos misticos!
Laercio Guerço Rodrigues
23. mai, 2012
Spring eu questiono não é de hoje.
Sérgio Lopes
23. mai, 2012
A gente tem um post aqui no Blog levantando pontos sobre os dois lados na discussão de Spring vs. Java EE:
http://blog.caelum.com.br/java-ee-versus-spring-retomando-a-discussao/
Minha opinião pessoal é que, pra maioria dos projetos, tecnicamente os dois são equivalentes. Usar um ou outro será mais por gosto e aspectos políticos na empresa. Eu gosto mais de CDI, acho bem mais fácil que o Spring, mas certamente ele tem menos recursos (o que pode ser bom).
Rodrigo Galba
23. mai, 2012
Oi Sergio, parabens pelo post.
Hoje eu utilizo spring nos meus projetos não apenas por conta de DI, mas também pela parte transacional e do contexto para testes de integração no proprio junit.
Como, com CDI, eu poderia resolver isso?
Sérgio Lopes
23. mai, 2012
Rodrigo,
O CDI, por ser Java EE, vai se integrar legal com o resto das tecnologias Java. Então pra fazer controle transacional, por exemplo, você vai usar as transações do container EJB (e pode ser EJB Lite, Web Profile, pra não precisar de um servidor de aplicação completo).
Outros exemplos: vá de JAX-WS pra web services, JAX-RS pra REST, Bean Validation pra validação, JPA pra persistência, EJB pra remotabilidade, JMS pra mensageria etc. E, precisando de coisas mais avançadas que o Java EE puro ainda não tem, você acaba conseguindo com frameworks de terceiros integrados (o Seam 3 é uma boa companhia pro CDI).
De testes, até onde sei não tem nada específico. Mas não sei se precisa na verdade. Eu uso jUnit aqui com CDI normalmente. Como meus beans CDI são classes simples, é só testá-las normalmente no jUnit (e mockar as dependências).
Abraços
Danilo Miranda
23. mai, 2012
@segio parabéns pelo post. Estou trabalhando com CDI a pouco tempo e estou adorando!
@rodrigo você pode baixar um projeto “quickstart” direto do Jboss pelo Jboss Tools, o projeto Kitchensink já vem com JSF2, CDI, JPA e o melhor com JUnit integrada, inclusive já tem uma classe de teste criada.
Olha só a documentação deste quickstart https://docs.jboss.org/author/display/AS7/Kitchensink+quickstart
Espero que ajude.
Frederico Maia
23. mai, 2012
Parabéns pelo post Sérgio, ficou muito bom pra quem está começando. Vi um vídeo de vocês da Caelum sobre usar o CDI no VRaptor e deu pra ver o poder e simplicidade dele.
Já estou usando no projeto atual na empresa, integrando com EJB`s, JAX-RS, JPA e etc. Ficou realmente muito bom e bem mais simples que o Spring.
Espero que as especificações continuem seguindo essa linha de simplicidade e eficiência!
Michael Nascimento Santos
24. mai, 2012
Sérgio,
Excelente artigo cara! Eu só discordo em uma coisa: CDI enquanto solução de DI é muitíssimo superior ao Spring. Agora, o Spring Framework é uma família de módulos, muitos dos quais são muito úteis e sem equivalente em qualidade. Seria muito bom se eles fossem DI agnósticos, aí seria o melhor dos dois mundos
Rafael Ponte
24. mai, 2012
Oi Sergio,
Excelente post, principalmente as dicas sobre como colocar CDI em container mais leves.
Eu sinceramente acho que o CDI conseguiu superar o Spring em termos de design e até simplicidade, porém a stack do Spring continua, na minha opinião, muito mais completa, principalmente no módulo Spring Testing, na qual nos permite escrever testes de integração facilmente sem necessidade de qualquer modificação no código de produção.
Thiago Marinho
25. mai, 2012
Opa, Muito bom o post, Obrigado. Também gostei de saber das dicas de utilizar CDI em container leve como TomCat.
Luca Bastos
25. mai, 2012
Concordo…
Só acrescento um pouco de história.
Porque surgiu o Spring?
Porque o Java EE era um LIXO, coisa que saiu de uma cabeça completamente obtusa, influenciada por empresas que queriam vender bilhões e que tinham total interesse que o Java EE fosse complicado para justificar a necessidade dos seus servidores.
Vou mais além.
Estas empresas e seus interesses comerciais, podem ter ajudado a Sun na escolha deste nome IMBECIL, ou seja, Java para enterprise. O mundo todo web, as empresas web predando todos os negócios em todas as áreas, as grandes corporações (as enterprises) fazendo projetos web e o Java desprezando este mercado.
Mas isto é assunto para um post inteiro.
O que eu queria dizer é que para o atual JEE (argh, os burros ainda mantém o E), o Spring só é necessário para outras coisas não exatamente àquelas para o que foi criado.
A menos que alguma implementação CDI se mostre com desempenho muito inferior ao Spring, coisa meio difícil de acontecer, ou que se use outras facilidades do Spring, não vejo sentido em usar Spring para injeção de dependências. Viu Sr VRaptor…
Sérgio Lopes
25. mai, 2012
Luca, o VRaptor 4 será em CDI!
http://www.slideshare.net/caelumdev/vraptor-cdiideias
Rafael
26. mai, 2012
Eu uso e recomendo, muito bom, leve, não é necessário a quantidade de anotações que o Spring tem…O CDI veio pra ficar..
Antonio
29. mai, 2012
Muito legal o post… Apenas 1 detalhe… o beans.xml e o context.xml ficam na pasta META-INF ou na WEB-INF ??
Sérgio Lopes
29. mai, 2012
Ficam na META-INF, Antonio
Antonio
29. mai, 2012
Oi Sérgio, é que para Web Applications o beans.xml deve ficar na WEB-INF, conforme o comentário do tutorial da Oracle…
http://docs.oracle.com/javaee/6/tutorial/doc/gjbnz.html
Sérgio Lopes
29. mai, 2012
Eita, bom saber. Fui conferir também na documentação do Weld e ele fala que funciona nos dois mesmo (META-INF e WEB-INF). O mais certo deve ser então no WEB-INF para wars. Mas o arquivo do Tomcat (context.xml) esse é no META-INF mesmo.
Valeu pela dica!
Tiago
31. mai, 2012
Legal o post. Sobre o Seam 3, que é uma excelente ferramenta para trabalhar com CDI, pelo que tenho lido o mesmo está fadado a ser descontinuado (devido às diversas críticas que essa versão sofreu por ser completamente diferente do Seam 2.x) e a Jboss deve iniciar um novo projeto com a Apache (que me falta o nome agora hehe). Os colegas têm mais informações sobre isso?
Também recomendo uma olhada pra quem se interessar no Apache CODI, “is your best friend for CDI based projects”. Ao menos é o que diz no site, né? Eu usei um pouco e gostei!
Obrigado.
Marcio Rosa
31. mai, 2012
Aqui na empresa usamos CDI com produções para injetar EJB, WS, JTA, DAOS, … sem duvida é um ganho muito significativo para sua aplicação eu recomendo muito !
Sérgio ainda não fui pegar minha apostila de arquitetura rs
Ótimo POST
Abraço
Moacir R.F
31. mai, 2012
Excelente artigo!
Que genial essa nova especificação!, não sabia que era possível utilizar no tomcat.
Jaabax
08. jun, 2012
Muito obrigado pelo post Sérgio… Mais tenho uma dúvida… A maneira que vc publicou no post é a maneira correta de se criar EntiyManagers dinamicamente? Preciso criar EntityManagers para um ERP multitenancy. Lí no tutorial do JEE 6 que se eu usar @PersistenceUnit em um EntityManagerFactory eu perco o gerenciamento do container, como transações e etc. Eu até perguntei isso na comunidade JBoss mas ninguém respondeu: https://community.jboss.org/thread/200658?tstart=60
Sérgio Lopes
08. jun, 2012
O post foca apenas no container CDI e não exige o uso do restante do Java EE (tanto que o exemplo é dado rodando no Tomcat, um servlet container básico).
Mas, na prática, se você usar um servidor Java EE full (JBoss, Glassfish etc), você pode e deve usar o gerenciamento de conexões e entity managers do servidor de aplicações. Aí você ganha controle transacional etc como você disse.
Jaabax
08. jun, 2012
Obrigado pela resposta Sérgio. Então pelo visto vou ter que continuar utilizando o @PersistenceContext em cada uma das minhas variáveis de instância do tipo EntityManager. Hoje eu faço assim: Se meu servidor 1 tem 20 clientes, crio um projeto com um GenericDAO com 20 variáveis de instância do tipo EntityManager anotadas com @PersistenceContext (cada cliente com sua base de dados). No servidor 2 faço a mesma coisa. Daí faço build selecionando o projeto dependendo do servidor. O que vc acha disso? Outra coisa, eu não consigo entender o @Produces… Pode me explicar por favor? Se createEntityManager() já cria um EntityManager, pra que anotar o método com @Produces? Mais um vez muito obrigado.
Sérgio Lopes
08. jun, 2012
Me parece uma boa solução essa sua.
E do @Produces, o que ele faz é expor o objeto retornado pelo seu método para o CDI. O método é um método simples como você disse, que constrói o objeto e pronto. Mas pra você poder injetar esse objeto em outros do sistema, o CDI precisa conhece-lo. É esse o papel do @Produces.
Clayton Passos
11. jun, 2012
Só encontrei uma dificuldade, quando trabalhamos com validações, seja no JSF seja junto aos EJBs, implementando as interfaces correspondentes, o @Inject não funciona.
Até onde vai meu conhecimento, isto se deve ao fato da especificação considerar uma validação como sendo um POJO sem comportamento, logo não seria passiva de utilização de um @Inject ou @EJB.
A alternativa é utilizar um lookup.
Sérgio Lopes
11. jun, 2012
Oi Clayton!
Use o Seam Faces que ele amarra essas coisas pra você! Você pode injetar em Validators, entre outras coisas.
Abraços
Flavio Cattapan
14. jun, 2012
Bom dia, Sérgio. Tudo bem ?
Cara não consegui ver vantagem no seu exemplo em utilizar o EJB 3, acho que aumentou a complexidade sem maiores ganhos.
Obrigado.
Sérgio Lopes
15. jun, 2012
Oi Flavio,
Só recomendo usar o EJB3 se realmente os ganhos forem visíveis. Se você quiser usar o gerenciamento de transações dele, a remotabilidade e os outros serviços do container, é legal saber que tudo isso se integra com o CDI.
Mas você pode usar o CDI sozinho e num Servlet Container como o Tomcat. E ai voce implementa os servicos que precisar (pode fazer um Interceptor CDI por exemplo pra cuidar das transações independentemente do EJB).
Abraços
Ricardo Longa
22. jun, 2012
Estamos utilizando CDI (Weld) em um novo projeto e é show de bola.
Gilmar M. dos Santos
22. jun, 2012
Muito bom o post parabéns!
Tive a oportinidade de fazer todos os modulos relacionados com Java na caelum do Rio de Janeiro e adiquiri uma ótima experiência, em dois desses modulos me deparei com CDI e depois com spring, realmente ambos os frameworks são muitos bons.
Parabéns!!!
Pedro
21. jul, 2012
Gostaria de largar o Spring para utilizar uma ferramenta Java, mas o Spring gerencia minhas transacoes do Hibernate, e principalmente utilizo AspectJ no Spring, sera possivel utilizar o AspectJ com CDI?
Rafael Nascimento
17. ago, 2012
olá, Sérgio!! Tenho uma grande dúvida sobre o CDI junto com o JSF 2:
CDI não tem um @ViewScoped, e me parece que o seu equivalente seria o @ConversationScoped. Mas no meu projeto não consegui substituir um pelo outro porque @ConversationScoped deve ser iniciado e fechado explicitamente, ao contrário do @ViewScoped, que é destruído pelo container quando outra página é carregada.
Nos exemplos que vi sobre o fechamento de um @ConversationScoped, um commandButton chama o metodo no respectivo bean que encerra a conversação. No entanto, geralmente um app JSF usa muitos compositions (a minha), como por exemplo uma barra de menus que pode chamar várias outras páginas e que tb pode aparecer em várias views. Assim, como eu poderia encerrar um atual @ConversationScoped e iniciar outro, uma vez que o composition é usuado por várias páginas ??
eu vi tb que se iniciar uma conversation, sem fechar a outra ativa, ocorre “IllegalStateException”
abraço
Renan
31. out, 2012
Conhecendo mais a fundo o CDI, vi alguns funcionalidades (O lance dos eventos) que podem simplificar uma aplicação que tenho escrita com VRaptor…
Sérgio Lopes, excelente post e apresentação com ideias para o VRaptor. =D
Felipe
07. nov, 2012
Blz Galera !! Estou com um problema se alguem puder me ajudar , vou começar o curso FJ-26 e ja estou tentando me familiarizar com o conteudo .
Fiz os passo-a-passo acima e continua me dandp esse erro aqui (Tomcat 7)
GRAVE: Error configuring application listener of class org.jboss.weld.environment.servlet.Listener
java.lang.ClassNotFoundException: org.jboss.weld.environment.servlet.Listener
Se alguem puder ajuda ae!!!
Sérgio Lopes
07. nov, 2012
Felipe, ClassNotFoundException é porque não ta achando a classe, o JAR do Weld nesse caso. Todos os JARs estao certinhos na pasta WEB-INF/lib?
Thatiana
08. nov, 2012
Olá Sérgio,
Saberia dizer se seria possível a configuração do CDI no Jboss 4.2?
Guilherme
21. nov, 2012
Você já fez algo com o Seam 3 – Módulo de persistência?
Referente ao gerenciamento de tranzações, como posso criar o ProdutorEntityManager em relação ao seu escopo e do BackingBean(Anotado com @Named e ViewScoped)?
Obrigado, um abraço.
Muito bom o post.
Thiago Fonseca
05. fev, 2013
Sérgio, utilizando o JBoss 7, a injeção de classes públicas com um construtor público padrão não está funcionando, como você disse no post.
Apenas quando acrescento anotações de EJB’s (Stateless, Singleton, etc…) para a classe, que a injeção ocorre.
Para configurar o CDI, acrescentei o beans.xml ao WEB-INF e acrescentei a dependência:
javax.enterprise
cdi-api
1.0-SP4
provided
O que fiz de errado para as classes publicas não estarem sendo injetadas?
Alberto Souza
05. fev, 2013
Oi Thiago,
Poderia ser mais claro em relação ao erro? Qual a exceptio que está acontecendo?
Realmente não era para ter nenhum problema. Qualquer classe que exista dentro do seu projeto web, deveria ser candidata a injeção e receber objetos injetados.
Abraço!,
Alberto
Felipe Gutierrez
05. fev, 2013
Pelo o que entendi , a duvida do Thiago aborda os seguintes tópicos:
1 – É possível injetar uma classe , se esta não for anotada como um EJB (stateless, stateful ou Singleton ) ?
No seu exemplo a classe ProdutoDAO não está anotada. Funciona deste jeito? Criei um exemplo e não funciona , não ocorre injeção. Somente se anoto ela como sendo um EJB.
Alberto Souza
05. fev, 2013
Oi Felipe,
Não existe essa restrição. Tudo que está no projeto que contém o beans.xml pode ser injetado e receber alguma coisa injetada. Não existe a necessidade de ser um ejb. O que acontece no seu projeto? NPE? Simplesmente nada é injetado?
Thiago Fonseca
06. fev, 2013
Alberto, obrigado por responder.
Quando tento injetar em uma classe sem anotações, nada é injetado e meu objeto permanece nulo.
Quando tento injetar em um Webservice (JAX-WS) recebo o seguinte erro: “Caused by: java.lang.RuntimeException: JBAS016060: Não foi possível resolver o bean CDI para o ponto de injeção”
Cassio Thadeu
21. fev, 2013
Estou enfretando problema em um projeto maven, não esta encontrando o BeanManager, o arquivo context.xml tem que ficar na seguinte estrutura:
webapp/META-INF/context.xml
ou em alguma outra?
André
20. mar, 2013
Parabés pelo post, achei muito interessante a forma de injetar o EntityManager utilizando o weld. Seguindo a idéia do post resolvi criar um DaoFactory e um EntityManagerFactory para injetar as minhas DAOs e o meu EntityManager, porém, não estou conseguindo fazer o @Inject EntityManager funcionar dentro da minha classe DAO que também foi injetada. Tem como fazer desta forma ou preciso mudar a minha abordagem?
Muito obrigado.
Daniel
07. mai, 2013
Uma vez usando CDI da até preguiça de pensar no Spring..
só tem um problema: qual framework MVC (action based) trabalha bem com CDI hoje em dia?
Alberto Souza
07. mai, 2013
Oi Daniel,
Estamos trabalhando na integração do VRaptor com ele
.
Abraço!
Alberto
Bruno
17. mai, 2013
Sergio, no VRaptor, como ele faz para ver as dependencias no construtor e injeta-las? Qual classe é responsável por isso?