如何在后端bean中获取托管bean的名称?

5

我正在使用JSF 1.1。我在我的faces-config.xml文件中有以下内容:

<managed-bean>
    <managed-bean-name>beanInstance1</managed-bean-name>
    <managed-bean-class>com.paquete.BeanMyBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

我希望在我的bean内获取托管bean的名称beanInstance1。以下是我的bean:

package com.paquete;

public class BeanMyBean {
   String atribute1;

   public BeanMyBean () {
       System.out.println("managed-bean-class="+this.getClass().getName());
       System.out.println("managed-bean-name="+????????????????????????);
       // How Can I get the "beanInstance1" literal from here??
   }

   // setters and getters
}

我知道如何获取com.paquete.BeanMyBean(使用this.getClass().getName())和BeanMyBean(使用this.getClass().getSimpleName())的文字,但我不知道如何获取托管名称(Bean的实例)。

我该如何获取beanInstance1的值?

1个回答

4

JSF标准API无法提供此信息。你可以通过以下方式遍历所有请求、会话和应用作用域获取最佳结果(代码来自这篇博客):

public static String lookupManagedBeanName(Object bean) {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    Map<String, Object> requestMap = externalContext.getRequestMap();

    for (String key : requestMap.keySet()) {
        if (bean.equals(requestMap.get(key))) {
            return key;
        }
    }

    Map<String, Object> sessionMap = externalContext.getSessionMap();
    for (String key : sessionMap.keySet()) {
        if (bean.equals(sessionMap.get(key))) {
            return key;
        }
    }

    Map<String, Object> applicationMap = externalContext.getApplicationMap();
    for (String key : applicationMap.keySet()) {
        if (bean.equals(applicationMap.get(key))) {
            return key;
        }
    }

    return null;
}

然而,有一个重要的限制,这个功能不能在Bean的构造函数内部工作,因为JSF尚未将其放置在任何范围内!您需要在稍后的时间点确定它,例如在操作方法中。

public void submit() {
    String name = lookupManagedBeanName(this);
    // ...
}

与具体问题无关,这是一个设计上的不良迹象。你认为这是解决方案的具体功能需求肯定要用其他方式来解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接