Obtenga beans administrados por JSF por nombre en cualquier clase relacionada con Servlet

Estoy intentando escribir un servlet personalizado (para AJAX / JSON) en el que me gustaría hacer referencia a mis @ManagedBeans por nombre. Estoy esperando hacer un mapa:

http://host/app/myBean/myProperty

a:

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

¿Es posible cargar un bean por nombre de un servlet normal? ¿Hay algún servlet o ayudante JSF que pueda usar?

Parece que soy mimado por Spring en el que todo esto es demasiado obvio.

En un servlet, puede obtener beans con scope de solicitud de la siguiente manera:

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

y la sesión cercó los frijoles por:

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

y frijoles con scope de aplicación por:

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

Si se está ejecutando en un marco / contenedor compatible con dependency injection y el bean es administrado por @Named de CDI en lugar de @ManagedBean de JSF, es aún más fácil:

 @Inject private Bean bean; 

Independientemente del scope, cuando estás realmente dentro de FacesContext (es decir, la solicitud HTTP actual ha sido servida a través del FacesServlet ), entonces la forma normal de JSF2 es usar Application#evaluateExpressionGet() :

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

que puede ser convenien de la siguiente manera:

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

y puede usarse de la siguiente manera:

 Bean bean = findBean("bean"); 

Sin embargo, cuando ya está dentro de @ManagedBean , usar @ManagedProperty es más limpio ya que es más declarativo.

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

Yo uso el siguiente método:

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

Esto me permite obtener el objeto devuelto de forma tipada.

¿Has probado un enfoque como en este enlace? No estoy seguro si createValueBinding() todavía está disponible, pero un código como este debería ser accesible desde un simple servlet antiguo. Esto requiere que bean ya exista.

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

Puede obtener el bean gestionado pasando el nombre:

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

Tenía el mismo requisito.

He usado la forma siguiente para obtenerlo.

Tuve una sesión de ámbito de frijol.

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

He utilizado el siguiente código en mi método servlet doPost ().

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

resolvió mi problema

Yo uso esto:

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

Y luego llama:

 MyManageBean bean = getBean(MyManageBean.class); 

De esta manera, puede refactorizar su código y rastrear usos sin problemas.