【问题标题】:CDI: get manually instance of bean of class which is declared with genericsCDI:手动获取用泛型声明的类的 bean 实例
【发布时间】:2017-03-31 16:43:23
【问题描述】:

这是我手动获取 cdi bean 实例的方式:

Bean<?> bean = (Bean<?>)beanManager.resolve(beanManager.getBeans(Foo.class));
Foo foo=(Foo) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));

如果我这样声明 Foo 类:

@Dependent
public class Foo{
   ...
}

一切正常。但是,如果我这样声明类 Foo

@Dependent
public class Foo<T>{
   ...
}

cdi 容器无法创建 cdi bean。如何手动获取使用泛型 (Foo) 声明的类的 cdi bean?

【问题讨论】:

    标签: java generics cdi


    【解决方案1】:

    您正在寻找的可能是javax.enterprise.util.TypeLiteral。 它是一个实用程序类,允许您指定(bean)类型以及类型变量。然后它允许检索原始类型以及内部的实际类型参数。这是一个代码sn-p:

    // define the type you want
    TypeLiteral<Foo<Bar>> typeLiteral = new TypeLiteral<Foo<Bar>>() {};
    
    // now search for beans; note that getBeans allows to specify Annotations as well!
    Set<Bean<?>> beans = beanManager.getBeans(typeLiteral.getType());
    
    // and apply resolution - you should get the one you want here
    Bean<?> bean = beanManager.resolve(beans);
    

    【讨论】:

    • @Pavel 对你有用吗?如果不是,有什么问题?我可以提供更多帮助,只需要看看情况如何 :)
    • 抱歉,没有收到关于您的回答的通知。
    • 看来你搞错了。使用 rawType 它不起作用。这种方式有效Set&lt;Bean&lt;?&gt;&gt; beans = beanManager.getBeans(typeLiteral.getType());
    • @Pavel_K 是的,你是对的,这是我的疏忽。我编辑了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2019-01-20
    • 1970-01-01
    • 2015-02-07
    • 2016-08-05
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多