102 votes

JSF - get bean géré par nom

Je suis en train d'écrire une coutume servlet (pour AJAX/JSON) dans lequel je souhaite référencer mon @ManagedBeans par nom. Je suis l'espoir de la carte:

http://host/app/myBean/myProperty

pour:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

Est-il possible de charger un bean par nom à partir d'une servlet? Est-il un servlet, JSF ou d'aide je pourrais utiliser pour cela?

Je semble être gâché par le Ressort dans lequel tout cela est trop évident.

265voto

BalusC Points 498232

Dans une Servlet, vous pouvez obtenir la portée de la requête de haricots:

Bean bean = (Bean) request.getAttribute("beanName");

la session et de l'étendue des haricots:

Bean bean = (Bean) request.getSession().getAttribute("beanName");

d'application et l'étendue des haricots:

Bean bean = (Bean) getServletContext().getAttribute("beanName");

Si vous êtes en cours d'exécution dans une injection de dépendance capable d'un cadre contenant et le haricot est géré par CDI @Named au lieu de JSF de l' @ManagedBean, c'est encore plus facile:

@Inject
private Bean bean;

Indépendamment de la portée, quand vous êtes réellement à l'intérieur de l' FacesContext (c'est à dire le courant de la requête HTTP a été servi par l' FacesServlet), puis la normale JSF2 façon est d'utiliser Application#evaluateExpressionGet():

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

qui peut être convenienced comme suit:

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

et peut être utilisée comme suit:

Bean bean = findBean("bean");

Toutefois, lorsque vous êtes déjà à l'intérieur d'un @ManagedBean, puis à l'aide de @ManagedProperty est plus propre, car il est plus déclaratif.

@ManagedProperty("#{bean}")
private Bean bean;

11voto

John Yeary Points 725

J'utilise la méthode suivante:

public static <T> T getBean(final String beanName, final Class<T> clazz) {
    ELContext elContext = FacesContext.getCurrentInstance().getELContext();
    return (T) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, beanName);
}

Cela me permet d'obtenir le retour de l'objet dans un typée.

3voto

James Poulson Points 5505

Avez-vous essayé une approche comme sur ce lien? Je ne suis pas sûr si createValueBinding() est encore disponible, mais le code comme celui-ci devrait être accessible à partir d'un simple vieux Servlet. Cela va nécessiter de la fève à la existent déjà.

http://www.coderanch.com/t/211706/JSF/java/access-managed-bean-JSF-from

 FacesContext context = FacesContext.getCurrentInstance();  
 Application app = context.getApplication();
 // May be deprecated
 ValueBinding binding = app.createValueBinding("#{" + expr + "}"); 
 Object value = binding.getValue(context);

3voto

Soujanya Points 1

Vous pouvez obtenir le managed bean en passant le nom de:

public static Object getBean(String beanName){
    Object bean = null;
    FacesContext fc = FacesContext.getCurrentInstance();
    if(fc!=null){
         ELContext elContext = fc.getELContext()
         bean = elContext.getELResolver().getValue(elContext, null, beanName);
    }

    return bean;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X