@PostConstruct не вызывается в PhaseListener

Я использую jsf2.2 с wildfly 8.1 и javaee7.

Моя инъекция компонента CDI в фазовращателе работает, как и ожидалось, но метод @PostConstuct никогда не вызывается

Я пытался аннотировать PhaseListener с помощью @javax.enterprise.context.ApplicationScope, SessionScope и Dependent, но безрезультатно.

Помимо именования, это именно то, что я делаю в своей конструкции поста.

//@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?


person maress    schedule 03.02.2015    source источник
comment
Покажи свой код. Возможно, вы нарушаете контракт на @PostConstruct   -  person kolossus    schedule 03.02.2015
comment
Что, если вы и явный конструктор по умолчанию?   -  person Kukeltje    schedule 03.02.2015
comment
@Kukeltje Что ты имеешь в виду конструктор по умолчанию? Phaselistener вызывается, проблема в том, что '@PostConstruct' не вызывается. Как в этом случае поможет явный конструктор по умолчанию?   -  person maress    schedule 03.02.2015
comment
Я вижу, что на него уже ответили. Это было просто предположение, так как я заметил раньше (уже не уверен, где и когда), что отсутствующий конструктор мешал правильно работать другому аннотированному методу. К счастью, сейчас это не так   -  person Kukeltje    schedule 03.02.2015


Ответы (1)


Согласно разделу 5.4.1 спецификации JSF 2.2, PhaseListener не управляемый компонент, но его можно вводить.

Согласно разделу 5.4.2, управляемые компоненты должны поддерживать аннотации жизненного цикла @PostConstruct и @PreDestroy.

Поскольку PhaseListener не является управляемым компонентом в смысле JSF, из спецификации не следует, что реализация слушателя фазы должна поддерживать @PostConstruct.

person Harald Wellmann    schedule 03.02.2015
comment
Несмотря на то, что я принимаю это как ответ, кажется странным, что внедрение зависимостей поддерживается без поддержки событий жизненного цикла. - person maress; 02.04.2015