Em um artefato baseado em servlet, tais como @WebServlet
, @WebFilter
e @WebListener
, você pode pegar um JSF "plain vanilla" @ManagedBean @RequestScoped
por:
Bean bean = (Bean) request.getAttribute("beanName");
e @ManagedBean @SessionScoped
por:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
e @ManagedBean @ApplicationScoped
por:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Observe que isso exige que o bean já tenha sido autocreado pelo JSF de antemão. Caso contrário, eles retornarão null
. Em seguida, você precisará criar manualmente o bean e usá-lo setAttribute("beanName", bean)
.
Se você for capaz de usar o CDI em @Named
vez do JSF 2.3 obsoleto @ManagedBean
, então é ainda mais fácil, especialmente porque você não precisa mais criar manualmente os beans:
@Inject
private Bean bean;
Observe que isso não funcionará quando você estiver usando, @Named @ViewScoped
porque o bean só pode ser identificado pelo estado de exibição JSF e isso só está disponível quando o FacesServlet
foi chamado. Portanto, em um filtro que roda antes disso, acessar um @Inject
ed @ViewScoped
sempre será lançado ContextNotActiveException
.
Somente quando você estiver dentro @ManagedBean
, você pode usar @ManagedProperty
:
@ManagedProperty("#{bean}")
private Bean bean;
Note que isso não funciona dentro de um @Named
ou @WebServlet
ou qualquer outro artefato. Ele realmente funciona @ManagedBean
apenas no interior .
Se você não estiver dentro de um @ManagedBean
, mas o FacesContext
estiver disponível (ou seja FacesContext#getCurrentInstance()
, não retornar null
), você também pode usar Application#evaluateExpressionGet()
:
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
que pode ser conveniente da seguinte forma:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
e pode ser usado da seguinte forma:
Bean bean = findBean("bean");
Veja também: