Dans un artefact basé sur un servlet, tel que @WebServlet
, @WebFilter
et @WebListener
, vous pouvez récupérer un JSF "plain vanilla" @ManagedBean @RequestScoped
en:
Bean bean = (Bean) request.getAttribute("beanName");
et @ManagedBean @SessionScoped
par:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
et @ManagedBean @ApplicationScoped
par:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Notez que cela nécessite que le bean soit déjà créé automatiquement par JSF au préalable. Sinon, ceux-ci reviendront null
. Vous devrez ensuite créer manuellement le bean et l'utiliser setAttribute("beanName", bean)
.
Si vous êtes en mesure d'utiliser CDI @Named
au lieu de la version obsolète de JSF 2.3 @ManagedBean
, c'est encore plus facile, en particulier parce que vous n'avez plus besoin de créer manuellement les beans:
@Inject
private Bean bean;
Notez que cela ne fonctionnera pas lorsque vous l'utilisez @Named @ViewScoped
car le bean ne peut être identifié que par l'état d'affichage JSF et n'est disponible que lorsque le FacesServlet
a été appelé. Donc, dans un filtre qui s'exécute avant cela, accéder à un @Inject
ed @ViewScoped
sera toujours lancé ContextNotActiveException
.
Ce n'est que lorsque vous êtes à l'intérieur que @ManagedBean
vous pouvez utiliser @ManagedProperty
:
@ManagedProperty("#{bean}")
private Bean bean;
Notez que cela ne fonctionne pas dans un @Named
ou @WebServlet
ou tout autre artefact. Cela ne fonctionne vraiment @ManagedBean
qu'à l' intérieur .
Si vous n'êtes pas à l'intérieur de a @ManagedBean
, mais que le FacesContext
est facilement disponible (c'est FacesContext#getCurrentInstance()
-à- dire qu'il ne revient pas null
), vous pouvez également utiliser Application#evaluateExpressionGet()
:
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
qui peut être commode comme suit:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
et peut être utilisé comme suit:
Bean bean = findBean("bean");
Voir également: