Substituindo @ManagedBean(eager=true) em JSF22
Pergunta
Estou procurando uma solução para substituir o @ManagedBean(eager=true)
anotação em JSF 2.2.
Tomei boa nota das propostas como que permitem a execução de código na inicialização do aplicativo.
Preciso, no entanto, acessar o FacesContext
, então esta solução não funciona: FacesContext.getCurrentInstance()
ainda é nulo neste momento.
Tentei encontrar alternativas para AfterDeploymentValidation
no SPI, mas não encontrei nada.
Como os desenvolvedores do DeltaSpike não parecem planejar implementar uma substituição para @ManagedBean(eager=true)
e como o OmiFaces ainda não suporta este tipo de solução, ver.Estou enviando uma mensagem em uma garrafa.
Por enquanto, basta acessar o @ManagedScoped(eager=true)
feijão, transformado em @Named
, no cabeçalho xhtml comum do meu webapp, mas é meio feio.
Solução
A melhor solução para uma aplicação JSF com DeltaSpike é a seguinte:
@ApplicationScoped
public class MyBean
{
public void init(@Observes PostConstructApplicationEvent event)
{
// init here
}
}
Outras dicas
Desde OmniFaces 1.8, há um CDI compatível @Eager
que não só funciona em @Named @ApplicationScoped
, mas também em CDI's @SessionScoped
e @RequestScoped
e OmniFaces @ViewScoped
.Veja também o entrada do blog e a exemplo de vitrine.
Você pode usá-lo com @Eager @ApplicationScoped
:
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import org.omnifaces.cdi.Eager;
@Named
@Eager
@ApplicationScoped
public class Bean {
// ...
}
ou com @Startup
, o que é um estereótipo para @Eager @ApplicationScoped
:
import javax.inject.Named;
import org.omnifaces.cdi.Startup;
@Named
@Startup
public class Bean {
// ...
}