En un artefacto basado en servlet, como @WebServlet
, @WebFilter
y @WebListener
, puede obtener un JSF "simple" @ManagedBean @RequestScoped
de la siguiente manera:
Bean bean = (Bean) request.getAttribute("beanName");
y @ManagedBean @SessionScoped
por:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
y @ManagedBean @ApplicationScoped
por:
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 @Named
lugar 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 @ViewScoped
porque el bean solo puede ser identificado por el estado de vista JSF y eso solo está disponible cuando FacesServlet
se ha invocado. Entonces, en un filtro que se ejecuta antes de eso, acceder a un @Inject
ed @ViewScoped
siempre 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 @Named
o @WebServlet
o cualquier otro artefacto. Realmente funciona @ManagedBean
solo por dentro .
Si no está dentro de a @ManagedBean
, pero FacesContext
está 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: