Remplacement de @ManagedBean(eager=true) dans JSF22
Question
Je recherche une solution pour remplacer le @ManagedBean(eager=true)
annotation dans JSF 2.2.
J'ai pris bonne note des propositions tel que qui permettent l'exécution de code au démarrage de l'application.
J'ai cependant besoin d'accéder au FacesContext
, donc cette solution ne fonctionne pas : FacesContext.getCurrentInstance()
est toujours nul à ce moment.
J'ai essayé de trouver des alternatives à AfterDeploymentValidation
dans SPI, mais je n'ai rien trouvé.
Comme les développeurs de DeltaSpike ne semblent pas envisager de mettre en œuvre une substitution à @ManagedBean(eager=true)
et comme OmiFaces ne supporte pas encore ce genre de solution, voir.J'envoie un message dans une bouteille.
Pour le moment, j'accède simplement au @ManagedScoped(eager=true)
haricot, transformé en @Named
, dans l'en-tête xhtml commun de mon application Web, mais c'est plutôt moche.
La solution
La meilleure solution pour une application JSF avec DeltaSpike est la suivante :
@ApplicationScoped
public class MyBean
{
public void init(@Observes PostConstructApplicationEvent event)
{
// init here
}
}
Autres conseils
Depuis OmniFaces 1.8, il y a un compatible CDI @Eager
qui fonctionne non seulement sur @Named @ApplicationScoped
, mais aussi sur CDI @SessionScoped
et @RequestScoped
et OmniFaces @ViewScoped
.Voir aussi le entrée de blog et le exemple de vitrine.
Vous pouvez l'utiliser soit avec @Eager @ApplicationScoped
:
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import org.omnifaces.cdi.Eager;
@Named
@Eager
@ApplicationScoped
public class Bean {
// ...
}
ou avec @Startup
, ce qui est un stéréotype pour @Eager @ApplicationScoped
:
import javax.inject.Named;
import org.omnifaces.cdi.Startup;
@Named
@Startup
public class Bean {
// ...
}