Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时获取JSF中所有托管bean的列表_Java_Jakarta Ee_Jsf 2 - Fatal编程技术网

Java 在运行时获取JSF中所有托管bean的列表

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

我想获得JSF应用程序中所有托管bean的列表。在春天,我可以做类似的事情。JSF中是否有相应的方法

我有许多实现接口的
@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时,这种方法根本不起作用。