En un artefacto basado en servlet, como @WebServlet, @WebFiltery @WebListener, puede obtener un JSF "simple" @ManagedBean @RequestScopedde la siguiente manera:
Bean bean = (Bean) request.getAttribute("beanName");
y @ManagedBean @SessionScopedpor:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
y @ManagedBean @ApplicationScopedpor:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Tenga en cuenta que esto requiere que el bean ya sea creado automáticamente por JSF de antemano. De lo contrario, estos volverán null. Luego, necesitaría crear manualmente el bean y usar setAttribute("beanName", bean).
Si puede usar CDI en @Namedlugar de JSF 2.3 en desuso @ManagedBean, entonces es aún más fácil, particularmente porque ya no necesita crear manualmente los beans:
@Inject
private Bean bean;
Tenga en cuenta que esto no funcionará cuando esté usando @Named @ViewScopedporque el bean solo puede ser identificado por el estado de vista JSF y eso solo está disponible cuando FacesServletse ha invocado. Entonces, en un filtro que se ejecuta antes de eso, acceder a un @Injected @ViewScopedsiempre arrojará ContextNotActiveException.
Solo cuando estés dentro @ManagedBean, puedes usar @ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
Tenga en cuenta que esto no funciona dentro de una @Namedo @WebServleto cualquier otro artefacto. Realmente funciona @ManagedBeansolo por dentro .
Si no está dentro de a @ManagedBean, pero FacesContextestá disponible (es decir FacesContext#getCurrentInstance(), no regresa null), también puede usar Application#evaluateExpressionGet():
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
que puede ser conveniente de la siguiente manera:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
y se puede utilizar de la siguiente manera:
Bean bean = findBean("bean");
Ver también: