Estou desenvolvendo uma estratégia com CDI para injeção de dependência do EntityManager que trabalha com um interceptador que é responsável pela abertura de transações. A solução já está funcionando, mas ela tem um problema para quem trabalha com mais de uma PU (persistence unit) ao mesmo tempo: o interceptador só é capaz de abrir a transação para apenas uma das PU. Conceitualmente, já resolvi o problema, mas tecnicamente ainda me foge como conseguir a solução. Explicarei o que preciso fazer e como faço hoje (funciona, mas tem efeito colateral).
Eu preciso, no interceptador, ter acesso a todas as instâncias do EntityManager (cada instância possui um qualificador diferente, permitindo um EntityManager para cada PU) que estão no escopo de request (lembrando que tenho um método produtor que joga os EntityManagers no escopo de request toda vez que faço o uso do EntityManager injetado).
Eu consegui fazer desta forma, mas o problema é que o container instância todos os meus EntityManagers qualificados, achando que eu estou querendo fazer uso deles, mas na verdade eu quero é saber os que já estão no escopo de request. Eu não quero que o container instâncie quem não está presente no escopo naquele momento. Esse código resolve meu problema, mas, como disse, cria desnecessariamente o EntityManager.
Este é o código:
@Inject @Any private Instance<EntityManager> entityManagers;
Estou precisando resolver isso para poder publicar a solução aqui no GUJ. Eu já havia publicado uma solução usando CDI, mas ela dependia de um plugin do OWB. A nova solução não depende de nada.