Замена @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 {
    // ...
}
Другие вопросы по тегам