2011-08-31 2 views
5

Używam JSF 1.1. Mam następujących w moim pliku faces-config.xml:Jak uzyskać zarządzaną nazwę komponentu bean z wnętrza komponentu bean?

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

Chcę uzyskać nazwę zarządzanego fasoli beanInstance1 w moim fasoli. To jest mój fasola:

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 
} 

wiem jak uzyskać com.paquete.BeanMyBean dosłowny (this.getClass().getName()) i BeanMyBean (this.getClass().getSimpleName()), ale nie wiem jak dostać Zarządzane Nazwa (instancja Bean).

Jak mogę uzyskać wartość beanInstance1?

Odpowiedz

4

Ta informacja nie jest dostępna w standardowym interfejsie API JSF. Najlepiej, co można dostać jest iść przez cały wniosek, sesji i aplikacji celownicze sobie w następujący sposób (kod jest kopiowany z this blog):

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

Jednak istnieje duża ale, to nie działa wewnątrz konstruktora fasoli po prostu dlatego, że JSF jeszcze go nie umieścił! Musisz to ustalić później, np. w metodzie akcji.

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

niezwiązane do konkretnego problemu, jest to zapach projekt. Konkretny wymóg funkcjonalny, dla którego uważasz, że jest to rozwiązanie, zdecydowanie musi zostać rozwiązany inaczej.

+2

Nie ma za co. Ponieważ jesteś tu nowy, nie zapomnij zaznaczyć odpowiedzi, która pomogła (w większości) w rozwiązaniu problemu, zobacz także http://meta.stackexchange.com/questions/5234/how-does-accepting-an -werwer-work/5235 # 5235 – BalusC