在生产模式下禁用phaselistener

时间:2018-04-25 12:46:36

标签: jsf

我已经为我们的应用设置了一些非常有用的东西。在开发模式中很有用,但在生产中却没有。例如,我注册了这个phaselistener

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

在生产模式下,没有必要这样做,所以我想知道你们如何使用JSF应用程序通过在生产模式下考虑PROJECT_STAGE状态来禁用它?

PS:在xhtml页面中,我意识到这很简单,因为我可以决定不使用#{facesContext.application.projectStage eq 'Development'}来呈现组件

3 个答案:

答案 0 :(得分:2)

您可以以编程方式而不是通过faces-config.xml注册PhaseListener,例如:

@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();
    }
}

(参见web.config

答案 1 :(得分:1)

使用系统事件监听器(参见https://www.tutorialspoint.com/jsf/jsf_applicationevents_tag.htm):

a = 1,
type(a)
>>> tuple

b = 1, 2
type(b)
>>> tuple

c = (1)
type(c)
>>>> int

答案 2 :(得分:0)

如果不在开发模式下,则可以通过扩展Primefaces LifecyclePhaseListener并从null方法返回getPhaseId()来实现。

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

}

这将绕过相位监听器