@PostConstruct未在PhaseListener中调用

时间:2015-02-03 00:06:46

标签: jsf-2 cdi postconstruct phaselistener

我正在使用jsf2.2和wildfly 8.1以及javaee7。

我在相位监视器中的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规范的一部分吗?

1 个答案:

答案 0 :(得分:3)

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

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

由于PhaseListener在JSF意义上不是托管bean,因此不遵循相位侦听器实现必须支持@PostConstruct的规范。