3

我想获取 JSF 应用程序中所有托管 bean 的列表。在 Spring 中,我可以做一些类似context.getBeansOfType()的事情。JSF中有对应的方法吗?

我有许多@ManagedProperty实现接口的bean。我想获取这些适配器的列表并遍历它们,而不是显式调用每个 bean 以保持代码干净。

谢谢

4

2 回答 2

5

您可以使用包中的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());
  }
}

注意:这与 Mojarra JSF 实现紧密耦合,不适用于其他实现。

于 2013-03-19T15:03:27.823 回答
0

如果您的 bean 已经在会话中,您可以尝试以下代码:

Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
for (Entry<String, Object> beanEntry : sessionMap.entrySet()) {
    String beanName = beanEntry.getKey();
    Object bean = beanEntry.getValue();
    //TODO do something with bean, i.e. check if it's implements your interface and store into list
}

通过说 bean 在会话中,我的意思是 bean 已经创建并在同一会话中的另一个对象中使用。

于 2018-08-10T10:53:40.240 回答