Em um artefato baseado em servlet, tais como @WebServlet, @WebFiltere @WebListener, você pode pegar um JSF "plain vanilla" @ManagedBean @RequestScopedpor:
Bean bean = (Bean) request.getAttribute("beanName");
e @ManagedBean @SessionScopedpor:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
e @ManagedBean @ApplicationScopedpor:
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 @Namedvez 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 @ViewScopedporque o bean só pode ser identificado pelo estado de exibição JSF e isso só está disponível quando o FacesServletfoi chamado. Portanto, em um filtro que roda antes disso, acessar um @Injected @ViewScopedsempre 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 @Namedou @WebServletou qualquer outro artefato. Ele realmente funciona @ManagedBeanapenas no interior .
Se você não estiver dentro de um @ManagedBean, mas o FacesContextestiver 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: