Ottieni bean gestito JSF per nome in qualsiasi class correlata a Servlet

Sto cercando di scrivere un servlet personalizzato (per AJAX / JSON) in cui vorrei fare riferimento al mio @ManagedBeans per nome. Spero di mappare:

http://host/app/myBean/myProperty

a:

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

È ansible caricare un bean per nome da un servlet regolare? C’è un servlet o un helper JSF che potrei usare per questo?

Mi sembra di essere viziato da Spring in cui tutto questo è troppo ovvio.

In un servlet, è ansible ottenere i bean con scope richiesta per:

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

e fagioli con scope di sessione di:

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

e fagioli con scope applicazione da:

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

Se stai utilizzando un framework / contenitore in grado di gestire dipendenze e il bean è gestito da @Named di CDI invece di @ManagedBean di JSF, è ancora più semplice:

 @Inject private Bean bean; 

Indipendentemente dall’ambito, quando ci si trova effettivamente all’interno di FacesContext (ovvero la richiesta HTTP corrente è stata pubblicata tramite FacesServlet ), il normale modo JSF2 utilizza l’ Application#evaluateExpressionGet() :

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

che può essere convenientemente come segue:

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

e può essere usato come segue:

 Bean bean = findBean("bean"); 

Tuttavia, quando sei già all’interno di @ManagedBean , usare @ManagedProperty è più pulito poiché è più dichiarativo.

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

Io uso il seguente metodo:

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

Questo mi consente di ottenere l’object restituito in modo tipizzato.

Hai provato un approccio come su questo link? Non sono sicuro che createValueBinding() sia ancora disponibile ma un codice come questo dovrebbe essere accessibile da un semplice vecchio servlet. Ciò richiede che il bean esista già.

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

Puoi ottenere il bean gestito passando il nome:

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

Ho avuto lo stesso requisito.

Ho usato il modo seguente per farlo.

Ho avuto un bean con scope di sessione.

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

Ho usato il codice seguente nel mio metodo doPost () servlet.

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

ha risolto il mio problema.

Io uso questo:

 public static  T getBean(Class clazz) { try { String 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  String getBeanName(Class clazz) { ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class); String beanName = managedBean.name(); if (StringHelper.isNullOrEmpty(beanName)) { beanName = clazz.getSimpleName(); beanName = Character.toLowerCase(beanName.charAt(0)) + beanName.substring(1); } return beanName; } 

E poi chiama:

 MyManageBean bean = getBean(MyManageBean.class); 

In questo modo puoi rifattorizzare il tuo codice e tracciare gli usi senza problemi.