2011-08-31 13 views
5

Estoy usando JSF 1.1. Tengo el siguiente en mi archivo faces-config.xml:¿Cómo obtener el nombre del bean administrado desde dentro del bean de respaldo?

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

quiero obtener el nombre del bean gestionado beanInstance1 dentro de mi frijol. Este es mi café en grano:

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 
} 

Sé cómo obtener el com.paquete.BeanMyBean literal (this.getClass().getName()) y el BeanMyBean (this.getClass().getSimpleName()), pero no sé cómo conseguir un nombre Gestionado (instancia de Bean).

¿Cómo puedo obtener el valor beanInstance1?

Respuesta

4

Esta información no está disponible para la API JSF estándar. Mejor lo que puede obtener es caminar a través de toda la solicitud, sesión y ámbitos de aplicación a sí mismo de la siguiente manera (código se copia de 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; 
} 

Sin embargo, hay una gran pero, esto no funciona ¡dentro del constructor del bean simplemente porque JSF aún no lo ha colocado en ningún ámbito! Debe determinarlo en un momento posterior, p. en un método de acción.

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

Sin relación al problema concreto, se trata de un olor diseño. El requisito funcional concreto para el que pensó que esta es la solución definitivamente tiene que ser resuelto de manera diferente.

+2

De nada. Como eres nuevo aquí, no olvides marcar la respuesta aceptada que ayudó (la mayoría) a resolver el problema, ver también http://meta.stackexchange.com/questions/5234/how-does-accepting-an -answer-work/5235 # 5235 – BalusC

Cuestiones relacionadas