如何从支持bean内部获取托管bean名称



我使用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。这是我的豆子:

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值?

标准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;
}
但是,有一个很大的but,这在bean的构造函数中不起作用,因为JSF还没有把它放在任何作用域中!您需要在稍后的某个点确定它,例如在操作方法中。
public void submit() {
    String name = lookupManagedBeanName(this);
    // ...
}

与具体问题无关的,这是一种设计气味。你认为这是解决方案的具体功能要求肯定要用不同的方法来解决。

相关内容

  • 没有找到相关文章

最新更新