2013-03-19 87 views
2

我想要获取JSF应用程序中所有托管bean的列表。在春天,我可以做点像context.getBeansOfType()。 JSF中有相应的方法吗?在运行时获取JSF中所有托管Bean的列表

我有一些@ManagedProperty bean实现了一个接口。我希望得到这些适配器的列表并循环遍历它们,而不是明确调用每个bean以保持代码清洁。

谢谢

+0

这是什么动机,或者只是好奇心? – 2013-03-19 14:38:25

+0

@LuiggiMendoza我会更新这个问题来澄清 – dev 2013-03-19 15:02:25

回答

4

您可以BeanManager类从com.sun.faces.mgbean包做到这一点:

ApplicationAssociate application = ApplicationAssociate.getInstance(FacesContext.getCurrentInstance().getExternalContext()); 
BeanManager beanManager = application.getBeanManager(); 
Map<String, BeanBuilder> beanMap = beanManager.getRegisteredBeans(); 
Set<Entry<String, BeanBuilder>>beanEntries = beanMap.entrySet(); 

for (Entry<String, BeanBuilder> bean: beanEntries) { 
    String beanName = bean.getKey(); 
    if (beanManager.isManaged(beanName)) { 
    BeanBuilder builder = bean.getValue(); 
    System.out.println("Bean name: " + beanName); 
    System.out.println("Bean class: " + builder.getBeanClass()); 
    System.out.println("Bean scope: " + builder.getScope()); 
    } 
} 

注:这是紧密结合钻嘴鱼科JSF实现和其他实现不起作用。

+4

注意:这个答案假设你使用Mojarra并在编译时classpath中有它。这不适用于其他JSF实现,也不适用于JSF API。 – BalusC 2013-03-19 15:08:09

+0

@partlov,谢谢,但我没有使用Mojarra。寻找一些通用的东西。 – dev 2013-03-19 17:35:15

+0

即使我没有使用Mojarra,我也会授予这个答案,因为它为我的问题提供了真正的答案..它不能在JSF本地完成。 – dev 2013-05-22 23:57:20