Olá, pessoal!
Estou tentando injetar o EntityManager no meu repositório genérico que será extendido por outros repositórios, porém o entityManager sempre fica nulo ou dá unsatisfied dependencies (erro de CDI).
O que estou fazendo de errado?
Tentei algumas outras anotações como @PersistenceContext
, @PersistenceContext(unitName = "my-pu-name")
, @Produces
e até anotar o BaseRepository com @Stateless
.
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import java.io.Serializable;
@ApplicationScoped
public class BaseRepository implements Serializable {
private static final long serialVersionUID = -2177241904083852057L;
@Inject
protected EntityManager em;
}
pom.xml:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.0.0.Alpha7</version>
</dependency>
Erro ao subir a aplicação:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type EntityManager with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject protected mateus.repository.BaseRepository.em
at mateus.repository.BaseRepository.em(BaseRepository.java:0)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPointForDeploymentProblems(Validator.java:378)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:290)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateGeneralBean(Validator.java:143)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:164)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:526)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:64)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.bootstrap.ConcurrentValidator$1.doWork(ConcurrentValidator.java:62)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
at org.jboss.weld.core@3.1.5.Final//org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:832)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Estou usando Wildfly 21 com Java 1.8.
Obrigado desde já!
O erro diz que ele não conseguiu injetar com o qualifier default, tenta anotar o EntityManager com um qualifier que aponte para sua PersistenceUnit.
Já tentei com PersistenceContext
e PersistenceUnit
.
A aplicação chega a subir, porém o entityManager fica nulo.
Se está ficando nulo provavelmente alguma configuração do PersistenceUnit pode estar incorreta.
Vc criou o beans.xml do CDI? (dependendo da versão do CDI, ele é obrigatório)
Tente deixar a classe BaseRepository assim:
@ApplicationScoped
public class BaseRepository {
@PersistenceContext
private EntityManager em;
@Produces
@RequestScoped
public EntityManager entityManager() {
return em;
}
}
Não deu certo
Sim, esse é o beans.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
E esse é o persistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="schamados" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/SchamadosDS</jta-data-source>
<class>mateus.entity.Classe</class>
[...] // Classes aqui
<class>mateus.entity.OutraClasse</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/schamados" />
<property name="javax.persistence.jdbc.user" value="postgres" />
<property name="javax.persistence.jdbc.password" value="postgres" />
<!-- Hibernate -->
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL95Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
<property name="hibernate.jdbc.use_get_generated_keys" value="true" />
<property name="hibernate.jdbc.use_scrollable_resultset" value="true" />
<property name="hibernate.connection.autocommit" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<!-- C3P0 -->
<property name="connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
<property name="hibernate.c3p0.min_size" value="10" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.acquire_increment" value="1" />
<property name="hibernate.c3p0.idle_test_period" value="3000" />
<property name="hibernate.c3p0.max_statements" value="1" />
<property name="hibernate.c3p0.timeout" value="1800" />
</properties>
</persistence-unit>
</persistence>
Galera,
Descobri que está funcionando, e que o problema na verdade é outro.
Estou chamando o UserRepository (que extende o BaseRepository) dentro do ShiroRealm, e parece que lá não dá para injetar diretamente um repository.
Vou focar em resolver esse problema e encerrar esse tópico.
Solução final:
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.io.Serializable;
@ApplicationScoped
public class BaseRepository implements Serializable {
private static final long serialVersionUID = -2177241904083852057L;
@PersistenceContext
protected EntityManager entityManager;
}
Agradeço a vocês pela ajuda!
1 curtida