编程查找参数化接口的所有bean

时间:2017-06-21 09:40:23

标签: java generics java-ee cdi deltaspike

鉴于类型:

public interface Foo<T, X extends A>{...}

我需要使用编程查找来查找实现给定接口的bean,而不管参数类型如何。由于类型安全分辨率,这将返回一个空集:

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

或通过Deltaspike:

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

其中AnyLit是:

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

}

有没有办法解决这个问题?

由于

2 个答案:

答案 0 :(得分:1)

我认为你可以使用TypeLiteral - 一个特殊的CDI类,它可以保存类型及其参数。通过这种方式,您可以大致以这种方式指定您想要的内容:

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

现在,这是(我希望)符合CDI assignability rules警告:未来的仿制药,在阅读之前先喝咖啡)。简而言之,您希望将Object用作类型,以便:

  • 找到所有其他类型,例如栏<Bar>(均可分配给Object
  • FooImpl<T> implements Foo<T>等参数也可以分配给Object
  • 它还会找到原始类型bean,例如MyFoo implements Foo

答案 1 :(得分:0)

查看容器提供的Instance bean,并执行以下操作:

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

Instance bean是Iterable,这意味着您可以迭代实现所述接口的所有bean

注意?泛型参数。在这种情况下,所有通用参数都匹配(java generics)