Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

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?

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.