Unsatisfied dependencies ao injectar EntityManager

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 :frowning:
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