我想获得JSF应用程序中所有托管bean的列表。在Spring,我可以做类似context.getBeansOfType()的事情。 JSF中有相应的方法吗?
我有许多实现接口的@ManagedProperty
bean。我想获取这些适配器的列表并循环遍历它们,而不是显式调用每个bean以保持代码清洁。
谢谢
答案 0 :(得分: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实现紧密结合,不适用于其他实现。
答案 1 :(得分: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已经被创建并在同一会话的另一个对象中使用。