Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida na Integração CDI + EJB + Extenções CDI

Olá Nico, peguei o exemplo do curso com CDI e adicionei a biblioteca Delta Spike para utilizar algumas features legais como os repositórios. O repositório usa o entity manager provido através do nosso producer que já estava criado anteriormente, e tudo funciona normalmente, basta injetar o repositório no managed bean e sair usando:

public class JPAUtil {
    private static EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("livraria");

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    public void close(@Disposes EntityManager em) {
        em.close();
    }
}
@Repository
public interface LivroRepository extends EntityRepository<Livro, Integr>
{
}

Minha dúvida é quando estamos em um ambiente Full JEE como o Wildfly, normalmente não precisamos do producer, o próprio container sabe injetar o EntityManager através da anotação @PersistenceContext e não tenho que me preocupar por exemplo com o fechamento do entitymanager, então no caso se querer usar os repositórios do DeltaSpike vou ter mesmo que fornecer esse entitymanager via producer mesmo estando dentro de um aplicationserver?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
5 respostas

Boa Pergunta. Alguém do Fórum pra ajudar ?

solução!

Oi Avelino, na época eu resolvi o problema. Algumas funcionalidades do delta spike como o módulo Jpa ou data pedem realmente que o entity Manager seja fornecido via producer, mas como estáusando wildfly basta no seu producer vc fazer:

@ApplicationScoped
public class EntityManagerProducer {

    @PersistenceContext(unitName="default")
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return  entityManager;
    }

}

como vc está num server app basta receber o entitymanager pelo persistence context, e pelo que li vc não precisa do @Dispose pois o ciclo de vida do entitymanager é gerenciado pelo server app

Legal. E como ficaria o "Repository" ? Alguma anotação especial? e qual a "@Transaction" você utilizou ? (Delta ou EJB). Ainda não estou conseguindo fazer um insert. erro: java.lang.IllegalStateException,message=A JTA EntityManager cannot use getTransaction()

Oi Avelino, eu uso o repository do proprio deltaspike

public abstract class UsuarioRepository extends AbstractEntityRepository<Usuario, Integer> {

    public Page<Usuario> todos(Pageable pageable){

        List<Usuario> lista = typedQuery("select u from Usuario u").setFirstResult(pageable.getOffSet()).setMaxResults(pageable.getPageSize()).getResultList();
        return new  Page<Usuario>(lista,pageable,total());
    }

    @Query("select count(u) from Usuario u")
    public abstract Long total();
    ic PaginatedList listarUsuarios(int page,int max){
        return  new PaginatorQueryHelper().list(this.entityManager(),Usuario.class, page, max);
    }

}

ele deve extender de AbstractEntityRepository e o entity manager deve ser exposto via producer

@ApplicationScoped
public class EntityManagerProducer {

    @PersistenceContext(unitName="segurancaPU")
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return entityManager;
    }

}

Como eu estou usando Wildfly 8 eu ainda precisei adicionar mais um arquivo de configuração para indicar ao deltaspike que quem gerencia as transações é o próprio container, basta criar um arquivo chamado apache-deltaspike.properties dentro de META-INF(mesmo diretório do beans.xml) e o conteúdo do apache-deltaspike.properties deve ser o seguinte:

globalAlternatives.org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy =org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy

Show Ricardo. Valeu.