Прослушиватель событий Spring

#spring-boot #java-11

#spring-загрузка #java-11

Вопрос:

Я публикую событие с помощью spring ApplicationEventPublisher

Способ публикации и издатель

  @Autowired
private ApplicationEventPublisher eventPublisher; 

 private void publishContributorUpdate(long contributorId, boolean isOwner){
    var upe = new DeactivateContributorEvent(this);
    upe.setContributorId(contributorId);
    upe.setOwner(isOwner);

    eventPublisher.publishEvent(upe);
}
  

Класс событий:

 public class DeactivateContributorEvent extends ApplicationEvent 
  

Слушатель здесь

   @Component
  public class ContributorDeactivateEventListener  {

@Autowired
private ContributorDao contributorDao;

@EventListener
public void onContributorDeactivation(final DeactivateContributorEvent event) {


        contributorDao.updateContributor(event.getContributorId(),event.isOwner(),false);
}
}
  

Итак, событие публикуется так, как я видел, но не читал. В чем может быть причина этого? Я использую spring-boot 2.1.3

Комментарии:

1. Все, что я вижу, выглядит нормально. Можете ли вы рассказать нам больше о том, как eventPublisher создается? Я бы также убедился, что ваш ContributorDeactivateEventListener класс действительно сканируется и создается. Вы можете добавить к нему конструктор и поместить точку останова в этот конструктор или добавить вызов журнала или «printf», чтобы знать, что он просматривается Spring. (Кстати, я предполагаю, что когда вы говорите «не прочитано», вы имеете в виду, что onContributorDeactivation это никогда не вызывается.)

2. @steve это правильно. Метод onContributorDeactivation не вызывается

3. Тогда вы понимаете, что я предлагаю? Я хотел бы знать, создается ли ваш ContributorDeactivateEventListener объект. Я предполагаю, что это не так, потому что если бы это было так, то Spring должен был вызывать его. — возможно, этот файл / класс не сканируется Spring при запуске. Это лучшее объяснение, которое я могу придумать.

4. Казалось бы, единственным другим объяснением было бы то, что eventPublisher это как-то неправильно. Но поскольку вы не получаете исключение NPE при его вызове, оно должно быть там, и я не могу придумать, как его настроить, чтобы не вызывать ваш ContributorDeactivateEventListener класс. Вам пришлось бы сделать что-то странное при настройке, чтобы оно не работало. Этот механизм чертовски прост в Spring. — Итак, я предполагаю, что Spring не сканировал ваш ContributorDeactivateEventListener класс на наличие аннотаций.

5. Еще одна вещь. Я предполагаю, что вы искали в своих журналах ошибки, касающиеся всего этого. Это было бы здорово сделать, если вы этого не сделали, на случай, если в журналах есть ответ.