2

データベースからいくつかのエンティティ (実際には、特定のインターフェイスを実装する Groovy スクリプト) をロードし、それらを Bean として提供する CDI 拡張機能を作成して、CDI によって注入されたこのインターフェイスのすべての実装を取得できるようにしたいと考えています。私はsthを考えます。次のように:

public class ExtensionClass implements Extension {
  @Inject 
  EntityManager em;

  public void afterBeanDiscovery(@Observes final AfterBeanDiscovery event, final BeanManager manager) {
    Entity entity = em.find();
    //do sth with entity...
  }
}

この方法でエンティティマネージャーを注入しようとすると、null になります (それほど驚くことではありません。@Inject が CDI 拡張クラス内で機能するとは思っていませんでした)。

CDI拡張機能内のエンティティマネージャに何らかの方法でアクセスすることは可能ですか(たとえば、BeanManagerを介して)? または、別の方法でデータベースにアクセスする必要がありますか?

4

2 に答える 2

1

EntityManager のプロデューサーを作成する必要があります。ただし、拡張機能内で実行することはお勧めしません。移植性がありません (すべての実装で機能する可能性がありますが、これは灰色の領域の 1 つです)。エンティティは、CDI コンテナーに処理させる代わりに生成する必要もあります。アプリケーションの開始時にエンティティを処理する必要がある場合は@Startup、EJB 仕様から使用することをお勧めします。

于 2013-05-11T16:23:54.117 に答える
0

CDI拡張機能内でエンティティマネージャーを取得する方法に興味がある人は、これが私のやり方です。まず、LightGuard が言ったように、エンティティ マネージャーを利用できるようにするためにプロデューサーを作成する必要があります。

 @Produces
 @MyQualifier
 public javax.persistence.EntityManager create() {
   return entityManager;
 }

cdi 拡張機能では、次のことができます。

 public class ScriptingExtension implements Extension {
   public void afterBeanDiscovery(@Observes final AfterBeanDiscovery event, final BeanManager manager) {
     final Set<Bean<?>> embeans = manager.getBeans(EntityManager.class);
     final Bean<?> bean = manager.resolve(embeans);

     final CreationalContext<?> creationalContext = manager.createCreationalContext(bean);
     final EntityManager em = (EntityManager) manager.getReference(bean, EntityManager.class, creationalContext);
     //do sth with entity manager... 
    }
  }

この場合のエンティティ マネージャーは、コンテナー CDI ライフサイクルのこの時点でのみ使用可能であり、それ以前 (ProcessAnnotatedType など) では使用できないことに注意してください。私の場合、これは問題でした。以前にインターセプトしなければならなかったいくつかの Bean を拒否したかったからです。そこで、データソースへの直接の JNDI ルックアップを使用して、自分に関連する情報をロードすることにしました。このような:

final InitialContext ctx = new InitialContext();
final DataSource dataSource = (DataSource) ctx.lookup("java:/jdbc/myDatasource");
于 2013-05-17T10:30:17.247 に答える