Obtenir le bean géré JSF par nom dans toute classe associée à Servlet

J’essaie d’écrire un servlet personnalisé (pour AJAX / JSON) dans lequel j’aimerais référencer mon @ManagedBeans par son nom. J’espère cartographier:

http://host/app/myBean/myProperty

à:

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

Est-il possible de charger un bean par nom à partir d’un servlet normal? Y a-t-il un servlet ou un assistant JSF que je pourrais utiliser pour cela?

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

Dans un Servlet, vous pouvez obtenir des beans de requête en:

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

et séance de haricots en:

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

et application de haricots couverts par:

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

Si vous utilisez un framework / conteneur capable d’injecter des dépendances et que le bean est géré par @Named place de @Named de JSF, c’est encore plus simple:

 @Inject private Bean bean; 

Indépendamment de l’étendue, lorsque vous vous trouvez dans FacesContext (c’est-à-dire que la requête HTTP en cours a été servie via FacesServlet ), la méthode JSF2 normale utilise Application#evaluateExpressionGet() evaluExpressionGet Application#evaluateExpressionGet() :

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

qui peut être convoqué comme suit:

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

et peut être utilisé comme suit:

 Bean bean = findBean("bean"); 

Cependant, lorsque vous êtes déjà dans un @ManagedBean , l’utilisation de @ManagedProperty est plus propre car elle est plus déclarative.

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

J’utilise la méthode suivante:

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

Cela me permet d’obtenir l’object renvoyé de manière typée.

Avez-vous essayé une approche comme sur ce lien? Je ne suis pas sûr que createValueBinding() soit toujours disponible mais que le code comme celui-ci devrait être accessible depuis une ancienne Servlet. Cela nécessite de bean pour exister 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); 

Vous pouvez obtenir le bean géré en passant le nom:

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

J’avais la même exigence

J’ai utilisé le moyen ci-dessous pour l’obtenir.

J’ai eu une séance de haricot scope.

 @ManagedBean(name="mb") @SessionScopedpublic class ManagedBean { -------- } 

J’ai utilisé le code ci-dessous dans ma méthode de servlet doPost ().

 ManagedBean mb = (ManagedBean) request.getSession().getAtsortingbute("mb"); 

cela a résolu mon problème.

J’utilise ceci:

 public static  T getBean(Class clazz) { try { Ssortingng beanName = getBeanName(clazz); FacesContext facesContext = FacesContext.getCurrentInstance(); return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + beanName + "}", clazz); //return facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, nomeBean); } catch (Exception ex) { return null; } } public static  Ssortingng getBeanName(Class clazz) { ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class); Ssortingng beanName = managedBean.name(); if (SsortingngHelper.isNullOrEmpty(beanName)) { beanName = clazz.getSimpleName(); beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.subssortingng(1); } return beanName; } 

Et puis appelez:

 MyManageBean bean = getBean(MyManageBean.class); 

De cette façon, vous pouvez réorganiser votre code et suivre les utilisations sans problème.