【问题标题】:Disable phaselistener in production mode在生产模式下禁用相位监听器
【发布时间】:2018-10-05 23:02:00
【问题描述】:

我设置了一些对我们的应用非常有用的东西。在开发模式下很有用,但在生产环境中不可用。比如我注册了这个phaselistener

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

在生产模式下,不需要这个,所以我想知道你们这些 JSF 应用程序是如何通过考虑生产模式下的 PROJECT_STAGE 状态来禁用的?

PS:在 xhtml 页面中,我知道这很容易,因为我可以决定不使用 #{facesContext.application.projectStage eq 'Development'} 呈现组件

【问题讨论】:

    标签: jsf


    【解决方案1】:

    您可以通过编程方式而不是通过 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();
        }
    }
    

    (参见http://javaevangelist.blogspot.de/2012/05/jsf-2-tip-of-day-programmatic.html

    【讨论】:

    • 感谢您的提示!确实应该可以完成这项工作,但我不喜欢使用托管 bean 范围的想法,而且您需要使用 eager 属性。这使得代码非常敏感。但是感谢您的想法,因为我从未想过以编程方式添加它。我所做的是将 System Event Listener 与 PostConstructApplicationEvent 事件一起使用
    【解决方案2】:

    使用系统事件监听器(见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;
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      这将绕过相位监听器

      【讨论】:

        猜你喜欢
        • 2020-10-14
        • 2019-03-07
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        • 2013-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多