Como empilhar annotations personalizadas em Java com anotação @Inject

Eu vi isso várias vezes ao navegar .. as pessoas estão usando anotação @Inject com seus próprios para injetar EntityManager assim:

 @Inject @MyEm EnityManager em; 

porque você não pode simplesmente injetar o EntityManager . Você pode fazer isso apenas com @PersistenceContext . Alguém sabe como fazer isso funcionar (com a anotação personalizada), porque não encontrei nenhuma informação na net? Dê um exemplo, se puder, por favor.

Basicamente, o que você precisa fazer é criar uma anotação de discriminador e usá-la em conjunto com um Produtor. Isso permite que você simplifique @Inject seu Entity Manager em outros beans dentro de seu aplicativo Java EE. Aqui está um exemplo:

 @Qualifier @Retention(RUNTIME) @Target(METHOD, FIELD, PARAMETER, TYPE) public interface @MyEm { } public class EntityProducer { @PersistenceContext(unitName = 'MyPU', type = PersistenceContextType.EXTENDED) private EntityManager entityManager; @Produces @MyEm public EntityManager getEntityManager() { return entityManager; } } public class MyDAO { @Inject @MyEm private EntityManager entityManager; } 

Isso é chamado de “qualificador”. Todo tutorial do CDI deve explicar sobre eles. Em resumo:

  • crie sua própria anotação e anote-a com @Qualifier
  • use sua anotação de qualificador em suas classs concretas que implementam alguma interface, ou em methods produtores que criam uma instância
  • use sua anotação personalizada no ponto de injeção para diferenciar entre duas ou mais implementações de uma interface