Guice Google EntityManager

188 views
Skip to first unread message

Will

unread,
Jul 12, 2013, 10:02:57 AM7/12/13
to caelum-...@googlegroups.com
Bom dia pessoal,

Estou tentando usar o JPA e Hibernate no Vraptor 3.5.1 e está me gerando um erro muito estranho.
Pesquisei pela internet e não consegui usar a API do GUICE.

Antes o Vraptor não usava isso e porque hoje estou precisando usar essa API para fazer a persistência dos objetos?

Alguém pode me ajudar ?

SEVERE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

1) No implementation for javax.persistence.EntityManager was bound.
  while locating javax.persistence.EntityManager
    for parameter 0 at br.com.baratolivre.parser.dao.CategoriesDao.<init>(CategoriesDao.java:20)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)

2) No implementation for javax.persistence.EntityManager was bound.
  while locating javax.persistence.EntityManager
    for parameter 0 at br.com.baratolivre.parser.dao.SubCategoriesDao.<init>(SubCategoriesDao.java:22)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)

2 errors
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:83)
at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)


@Component
public class CategoriesDao {
private EntityManager em;
private Result result;
public CategoriesDao(EntityManager em, Result result){
this.em = em;
this.result = result;
}
public void InsertCategories(Categories catm){
try {
this.em.persist(catm);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Abraços!

Lucas Cavalcanti

unread,
Jul 12, 2013, 10:11:57 AM7/12/13
to caelum-vraptor
O que vc quer dizer com usar a API do Guice? o que vc tentou fazer e não conseguiu?

O erro diz que não existe implementação do EntityManager. O VRaptor não vem com a configuração da JPA por padrão,
vc precisa criar uma ComponentFactory pra isso, ou usar o plugin vraptor-jpa que já faz isso pra vc.


--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To unsubscribe from this group and stop receiving emails from it, send an email to caelum-vrapto...@googlegroups.com.
To post to this group, send email to caelum-...@googlegroups.com.
Visit this group at http://groups.google.com/group/caelum-vraptor.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Willian

unread,
Jul 12, 2013, 10:31:17 AM7/12/13
to caelum-...@googlegroups.com
Lucas,

Eu sou dou um Start no tomcat e da esses erros. 

Eu baixei o projeto do Vraptor e comecei a usar, não adicionei esses Jar do Google Guice.

Para testar se esta tudo certo com na hora de persistir o objeto criei um Factory, e também estou com todos os jar do HIbernate.

public EntityManager getEntityManager() {
return entityManagerFactory.createEntityManager();
}

Criei um main para persistir os objetos.

EntityManager em  = new JPAUtil().getEntityManager();
em.getTransaction().begin();

// cria objeto

em.persist(subCatm);
em.getTransaction().commit();
em.close();


Funciona !


Agora não entendo porque só com um start no tomcat me gera esse erro? Sempre fiz assim e funciona.

Abraços!



2013/7/12 Lucas Cavalcanti <lucasm...@gmail.com>

Chico Sokol

unread,
Jul 12, 2013, 10:33:41 AM7/12/13
to caelum-vraptor
Oi Willian,

Como está a sua factory?

Para poder receber o EntityManager injetado no controller a sua
factory precisa implementar a interface
ComponentFactory<EntityManager>, ela implementa?


--
Chico Sokol


2013/7/12 Willian <aquin...@gmail.com>:

Willian

unread,
Jul 12, 2013, 10:40:43 AM7/12/13
to caelum-...@googlegroups.com
Então,

Eu no meu controler só chamo o DAO passando o objeto que ero persistir, e com hibernate hibernate-entitymanager-4.2.2.Final.jar para chamar o EntityManager no meu DAO.


@Resource
public class CategoriesController {

private Result result;
private final CategoriesDao catrDao;
private final SubCategoriesDao subCatr;
public CategoriesController(Result result, CategoriesDao catrDao, SubCategoriesDao subCatr) {
this.result  = result;
this.catrDao = catrDao;
this.subCatr = subCatr;
}
@Get @Path("/createCategories")
public void createCategories(String source){
            Categories catm = new Categories();
            catm.setNameCategorie(node.getChildTextTrim("n"));
            catm.setLink(node.getChild("lnk").getAttributeValue("url"));
            this.catrDao.InsertCategories(catm);
           
}
}



@Component
public class CategoriesDao {
private EntityManager em;
private Result result;
public CategoriesDao(EntityManager em, Result result){
this.em = em;
this.result = result;
}
public void InsertCategories(Categories catm){
try {
this.em.persist(catm);
} catch (Exception e) {
e.printStackTrace();
}
}
}




Minha Factory para teste

public class JPAUtil {
private static EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("nome_do_banco");

Lucas Cavalcanti

unread,
Jul 12, 2013, 1:18:57 PM7/12/13
to caelum-vraptor

Willian

unread,
Jul 12, 2013, 1:53:35 PM7/12/13
to caelum-...@googlegroups.com
Lucas,

Muito obrigado, vou fazer aqui o que você falo.

Abraços!

Willian

unread,
Jul 12, 2013, 4:23:21 PM7/12/13
to caelum-...@googlegroups.com
Lucas,

Desculpe a ignorância mas não consegui entender como funciona essa API que você passo.

Realmente não entendo porque agora tenho que fazer isso para ter um EntityManager?

Antes só precisava passar o EntityManager com injeção de dependência do DAO e estava tudo certo.


Eu tentei fazer assim.



@Component
@RequestScoped
public class EntityManagerCreator implements ComponentFactory<EntityManager> {
private final EntityManagerFactory factory;
private EntityManager em;
public EntityManagerCreator(EntityManagerFactory factory) {
this.factory = factory;
}

@PostConstruct
public void create(){
this.em = factory.createEntityManager();
}
public EntityManager getInstance() {
return this.em;
@PreDestroy
public void destroy(){
this.em.close();
}

}



@Component
public class CategoriesDao {
private EntityManagerCreator factory;
private Result result;
private EntityManager em;
public CategoriesDao(Result result, EntityManagerCreator factory){
this.result  = result;
this.factory = factory;
}
public void InsertCategories(Categories catm){
try {
this.em = this.factory.getInstance();
this.em.persist(catm);
this.factory.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}
}

E gerou o seguinte erros quando Start do Tomcat.


SEVERE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

1) No implementation for javax.persistence.EntityManagerFactory was bound.
  while locating javax.persistence.EntityManagerFactory
    for parameter 0 at br.com.baratolivre.util.EntityManagerCreator.<init>(EntityManagerCreator.java:20)
  at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)

1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:83)
at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4775)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5452)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)



Abraços!


 


Lucas Cavalcanti

unread,
Jul 12, 2013, 4:28:23 PM7/12/13
to caelum-vraptor
Vc precisa criar essa tb:

Na verdade o melhor que vc pode fazer é apagar a classe JpaUtil e essa factory que vc criou e colocar esse jar no WEB-INF/lib:

no máximo vc vai precisar colocar no web.xml:

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>br.com.caelum.vraptor.util.jpa</param-value>
</context-param>

se vc já tiver esse parametro (com outro valor) acrescente o pacote da jpa separado por vírgula.


2013/7/12 Willian <aquin...@gmail.com>
Reply all
Reply to author
Forward
0 new messages