2017-06-21 4 views
2

プログラムによる検索

final Set<Bean<?>> foos= BeanManagerProvider.getInstance().getBeanManager().getBeans(Foo.class, new AnyLit()); 

またはDeltaspike経由:ので、タイプセーフ解像度で、これは空のセットを返しますAnyLitがある

org.apache.deltaspike.core.api.provider.BeanProvider.getDependent(Foo.class, new AnyLit()) 

private static class AnyLit extends AnnotationLiteral<Any> implements Any 
{ 

} 

は、この問題を回避する方法はありますか?私はあなたがTypeLiteralの使用を作ることができると思う

おかげ

答えて

1

- タイプおよびそれのパラメータを保持することができる特別なCDIクラス。 (:、先にジェネリックをを読む前にコーヒーを買うWARNING)CDI assignability rulesと一致して(私は願っています)これは、今

TypeLiteral<Foo<Object, Object>> typeLiteral = new TypeLiteral<Foo<Object, Object>>() {}; 
BeanManager bm; //assuming you can retrieve BM somehow 
bm.getBeans(typeLiteral.getType(), new AnyLit()); 

を:これによりあなたは、およそこのような方法で正確にあなたが望むものを指定することができます。それは、このようなFooImpl<T> implements Foo<T>などのパラメータは、また、割り当て可能になります(すべてのObjectに割り当てている)、バー<Bar>など他のすべてのタイプ、

  • を見つけ

    • :一言で言えば、あなたはそのようタイプとしてObjectを使用したいです:Object
    • にそれはまた、このようなMyFoo implements Foo
  • +0

    私はここであなたのアイデアを取り、それを私のユースケースのために働かせました。おかげで – Gee2113

    +0

    あなたはようこそ。 Btwは実際には醜いものではありません。つまり、型パラメータを保持する特別なクラスを持つ以外の方法はありません。これはCDIの制限ではなく、Javaの制限です。タイプの消去のため、この情報は失われます。そのため、あなたはそれを他の場所で補う必要があります。 – Siliarus

    0

    などの生タイプの豆は、コンテナによって提供されInstance豆を見てくださいとような何かを見つけます

    @Any 
    @Inject 
    private Instance<MyInterface<?>> myParametrizedInterfaces; 
    

    Instance Beanは、あなたが言ったインターフェイス

    を実装するすべての豆が?ジェネリックパラメータに注目してください反復処理できることを意味し、Iterableです。この場合、すべての汎用パラメータが一致します(Javaジェネリック)

    +0

    インスタンスは正常に動作しますが、私の使用例では静的にBeanを検索する必要があります。基本的にDeltaspikes DependentProvider(または依存するBeanを取得する同様の方法)をラップして、アプリケーションスコープのBeanを呼び出すときにメモリリークを防ぐために使用後に依存スコープのBeanを自動的に破棄します。あなたの答えはいくつかの人には役に立ちますが – Gee2113

    関連する問題