Java 在运行时获取JSF中所有托管bean的列表
我想获得JSF应用程序中所有托管bean的列表。在春天,我可以做类似的事情。JSF中是否有相应的方法 我有许多实现接口的Java 在运行时获取JSF中所有托管bean的列表,java,jakarta-ee,jsf-2,Java,Jakarta Ee,Jsf 2,我想获得JSF应用程序中所有托管bean的列表。在春天,我可以做类似的事情。JSF中是否有相应的方法 我有许多实现接口的@ManagedPropertybean。我希望获得这些适配器的列表并循环使用它们,而不是显式地调用每个bean以保持代码整洁 谢谢您可以使用com.sun.faces.mgbean包中的BeanManager类执行此操作: ApplicationAssociate application = ApplicationAssociate.getInstance(FacesCont
@ManagedProperty
bean。我希望获得这些适配器的列表并循环使用它们,而不是显式地调用每个bean以保持代码整洁
谢谢您可以使用
com.sun.faces.mgbean
包中的BeanManager
类执行此操作:
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());
}
}
ApplicationAssociate application=ApplicationAssociate.getInstance(FacesContext.getCurrentInstance().getExternalContext());
BeanManager BeanManager=application.getBeanManager();
Map beanMap=beanManager.getRegisteredBeans();
SetbeanEntries=beanMap.entrySet();
for(条目bean:beanEntries){
字符串beanName=bean.getKey();
if(beanManager.isManaged(beanName)){
BeanBuilder builder=bean.getValue();
System.out.println(“Bean名称:+beanName”);
System.out.println(“Bean类:+builder.getBeanClass());
System.out.println(“Bean范围:+builder.getScope());
}
}
注意:这与Mojarra JSF实现紧密结合,不适用于其他实现。如果您的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
}
Map sessionMap=FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
对于(条目beanEntry:sessionMap.entrySet()){
字符串beanName=beanEntry.getKey();
对象bean=beanEntry.getValue();
//TODO使用bean做一些事情,即检查它是否实现了您的接口并存储到列表中
}
如果说一个bean在会话中,我的意思是该bean已经在同一会话中的另一个对象中创建和使用了。这是出于什么动机,还是出于好奇?@luigimendoza我将更新这个问题以澄清说明:这个答案假设您使用的是mojara,并且它位于编译时类路径中。这在其他JSF实现中不起作用,也不会针对JSF API进行编译。@partlov,谢谢,但我没有使用Mojarra。寻找一些通用的东西。即使我没有使用Mojara,我也会给这个答案,因为它为我的问题提供了真正的答案。。警告:这种方法只有在您使用遗留bean管理工具时才有效,一年多前,该工具因支持CDI而被弃用。当使用CDI时,这种方法根本不起作用。