Отключить фазселистенер в производственном режиме - PullRequest
0 голосов
/ 25 апреля 2018

Я настроил несколько вещей, весьма полезных для нашего приложения. Полезно в режиме разработки, но не в производстве. Например, я зарегистрировал этот фазелистенер

<lifecycle>
    <phase-listener>org.primefaces.component.lifecycle.LifecyclePhaseListener</phase-listener>
</lifecycle>

В производственном режиме это не нужно, поэтому мне было интересно, как вы, ребята, с приложением JSF отключаете вещи, принимая во внимание состояние PROJECT_STAGE в производственном режиме?

PS: На страницах xhtml я знаю, что это легко, поскольку я могу решить не отображать компонент, используя #{facesContext.application.projectStage eq 'Development'}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Использование прослушивателя системных событий (см. https://www.tutorialspoint.com/jsf/jsf_applicationevents_tag.htm):

public class PostConstructApplicationListener implements SystemEventListener {

    @Override
    public void processEvent(SystemEvent event) {
        if (event instanceof PostConstructApplicationEvent) {
            setupLifeCycleListener();
        }
    }

    /**
     * Add <code>org.primefaces.component.lifecycle.LifecyclePhaseListener</code> in case PROJECT_STAGE is not set to "Production"
     */
    private void setupLifeCycleListener() {
        if (Faces.getApplication().getProjectStage() != ProjectStage.Production) {
            LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
            Lifecycle lifecycle = factory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
            lifecycle.addPhaseListener(new LifecyclePhaseListener());
        }
    }

    @Override
    public boolean isListenerForSource(Object source) {
        return source instanceof Application;
    }
}
0 голосов
/ 22 мая 2019

Вы можете сделать это, расширив Primefaces LifecyclePhaseListener и вернув null из метода getPhaseId(), если не в режиме разработки.

public class LifecycleForDevelopmentPhaseListener extends LifecyclePhaseListener {
    @Override
    public PhaseId getPhaseId() {
        if (!FacesContext.getCurrentInstance().isProjectStage(ProjectStage.Development)) {
            return null;
        }
        return super.getPhaseId();
    }

}

Это обойдёт слушателя фазы

0 голосов
/ 25 апреля 2018

Вы можете зарегистрировать PhaseListener программно, а не через face-config.xml, например:

@ManagedBean(eager = true)
@ApplicationScoped
public class ApplicationBean {

    @PostConstruct
    private void initialize() {
        LifecycleFactory factory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
        Lifecycle lifecycle = factory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
        if (ProjectStage.Development.equals(getProjectStage())) {
            lifecycle.addPhaseListener(new PhaseListenerImpl());
        }
    }

    private ProjectStage getProjectStage() {
        FacesContext fc = FacesContext.getCurrentInstance();
        Application appl = fc.getApplication();
        return appl.getProjectStage();
    }
}

(ср. http://javaevangelist.blogspot.de/2012/05/jsf-2-tip-of-day-programmatic.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...