【问题标题】:@PostConstruct not invoked in PhaseListener@PostConstruct 未在 PhaseListener 中调用
【发布时间】:2015-04-02 01:44:48
【问题描述】:

我正在将 jsf2.2 与 Wildfly 8.1 和 javaee7 一起使用。

phaselistener 中的 CDI bean 注入按预期工作,但从未调用过 @PostConstuct 方法

我尝试用 @javax.enterprise.context.ApplicationScope、SessionScope 和 Dependent 注释 Phaselistener 无济于事。

除了命名之外,这正是我在帖子构造中所做的事情。

//@ApplicationScope
//@SessionScope
//@Dependent
public class MyPhaseListener implements PhaseListener {

   @Inject
   @Any
   private Instance<MyOrderedUrlHandler> myOrderedUrlhandlers;
   private Map<String, List<MyOrderedUrlHandler> orderedUrlHandlersMap;

   @PostConstruct
   void mapOrderedUrlHandlers() {
      LOG.info("Executing postconstruct");
      orderedUrlHandlersMap = Maps.newHashMap();

      for(final MyOrderedUrlHandler urlhandler : myOrderedUrlhandlers) {
         final String handles = urlhandler.url();
         final List<MyOrderedUrlHandler> registeredHandlers = orderedUrlHandlersMap.get(handles);

         if(registeredHandlers == null) {
            registeredHandlers = Lists.newArraList();
         }
         registeredHandlers.add(urlHandler);
         orderedUrlHandlersMap.put(handles, registeredHandlers);
      }
   }
}

方法级注入也可以正常工作。

@PostConstruct 回调是否不是 jsf Phaselistener 规范的一部分?

【问题讨论】:

  • 显示您的代码。你可能违反了@PostConstruct的合同
  • 如果你和一个显式的默认构造函数怎么办?
  • @Kukeltje 默认构造函数是什么意思?调用phaselistener,问题是没有调用'@PostConstruct'。在这种情况下,显式默认构造函数有什么帮助?
  • 我看到它已经回答了。这只是一个猜测,因为我之前已经注意到(不知道何时何地)丢失的构造函数会阻止另一个带注释的方法正常工作。幸运的是,现在情况似乎并非如此

标签: jsf-2 cdi postconstruct phaselistener


【解决方案1】:

根据JSF 2.2 spec 的第 5.4.1 节,PhaseListener 不是托管 bean,而是可注入的。

根据第 5.4.2 节,托管 bean 必须支持生命周期注释 @PostConstruct@PreDestroy

由于 PhaseListener 不是 JSF 意义上的托管 bean,因此从规范中不遵循阶段侦听器实现必须支持 @PostConstruct

【讨论】:

  • 即使我接受这个作为答案,在没有生命周期事件支持的情况下支持依赖注入似乎很奇怪。
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多