Как получить управляемое имя бина из поддерживающего бина? - PullRequest
5 голосов
/ 01 сентября 2011

Я использую 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>

Я хочу получить имя управляемого компонента 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?

1 Ответ

4 голосов
/ 01 сентября 2011

Эта информация недоступна стандартному API JSF. Лучшее, что вы можете получить - это пройти все области запросов, сессий и приложений следующим образом (код скопирован из этого блога ):

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;
}

Однако, есть большое , но , это не работает внутри конструктора бина просто потому, что JSF еще не поместил его ни в одну область видимости! Вы должны определить это на более позднем этапе, например, в методе действия.

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

Не имеет отношения к конкретной проблеме , это запах конструкции. Конкретное функциональное требование, для которого вы думали, что это решение, должно определенно решаться иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...