Замена @ManagedBean(eager=true) в JSF22
Я ищу решение заменить @ManagedBean(eager=true)
аннотация в JSF 2.2.
Я принял к сведению предложения , которые позволяют выполнить код при запуске приложения.
Однако мне нужно получить доступ к FacesContext
, так что это решение не работает: FacesContext.getCurrentInstance()
все еще нулевой в это время.
Я пытался найти альтернативы AfterDeploymentValidation
в SPI, но ничего не нашел.
Поскольку разработчики DeltaSpike, похоже, не планируют осуществлять замену @ManagedBean(eager=true)
и поскольку OmiFaces еще не поддерживает такого рода решение, см. Я отправляю сообщение в бутылке.
Пока что я просто получаю доступ к @ManagedScoped(eager=true)
боб, превращенный в @Named
, в моем веб-приложении общий заголовок xhtml, но это отчасти уродливо.
2 ответа
Лучшее решение для приложения JSF с DeltaSpike - следующее:
@ApplicationScoped
public class MyBean
{
public void init(@Observes PostConstructApplicationEvent event)
{
// init here
}
}
Начиная с OmniFaces 1.8, есть CDI-совместимый @Eager
который не только работает на @Named @ApplicationScoped
но также на CDI @SessionScoped
а также @RequestScoped
и OmniFaces @ViewScoped
, Смотрите также запись в блоге и пример демонстрации.
Вы можете использовать его либо с @Eager @ApplicationScoped
:
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import org.omnifaces.cdi.Eager;
@Named
@Eager
@ApplicationScoped
public class Bean {
// ...
}
или с @Startup
, который является стереотипом для @Eager @ApplicationScoped
:
import javax.inject.Named;
import org.omnifaces.cdi.Startup;
@Named
@Startup
public class Bean {
// ...
}