AbstractMongoEventListener не вызывается

У меня следующий класс

class MongoCascadeSaveEventListener extends AbstractMongoEventListener<Object> {

    @Override
    public void onBeforeConvert(final BeforeConvertEvent<Object> event) {
    }
}

Определение фасоли

@Bean
public MongoCascadeSaveEventListener mongoCascadeSaveEventListener() {
    return new MongoCascadeSaveEventListener();
}

onBeforeConvert никогда не вызывается.

Когда я проверяю класс MongoTemplate, издатель событий устанавливается следующим образом

eventPublisher = new MongoMappingEventPublisher(indexCreator);

Класс из пакета spring mongo. Когда я вижу класс, я не думаю, что реализация правильная, и это объясняет, почему слушатель не вызывается.

public class MongoMappingEventPublisher implements ApplicationEventPublisher {

    private final MongoPersistentEntityIndexCreator indexCreator;

    /**
     * Creates a new {@link MongoMappingEventPublisher} for the given {@link MongoPersistentEntityIndexCreator}.
     * 
     * @param indexCreator must not be {@literal null}.
     */
    public MongoMappingEventPublisher(MongoPersistentEntityIndexCreator indexCreator) {

        Assert.notNull(indexCreator, "MongoPersistentEntityIndexCreator must not be null!");
        this.indexCreator = indexCreator;
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.context.ApplicationEventPublisher#publishEvent(org.springframework.context.ApplicationEvent)
     */
    @SuppressWarnings("unchecked")
    public void publishEvent(ApplicationEvent event) {
        if (event instanceof MappingContextEvent) {
            indexCreator.onApplicationEvent((MappingContextEvent<MongoPersistentEntity<?>, MongoPersistentProperty>) event);
        }
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.context.ApplicationEventPublisher#publishEvent(java.lang.Object)
     */
    public void publishEvent(Object event) {}
}

это ошибка или мне что-то здесь не хватает? Использование 2.0.5. Выпустите версию Spring data mongo.

0
0
986
1

Ответы 1

Ваша конфигурация выглядит нормально, и должен быть вызван слушатель, MongoTemplate реализует ApplicationContextAware и, следовательно, после создания он устанавливает eventPublisher в applicationContext

Ты неправ. Значение издателя во время выполнения - MongoMappingEventPublisher

Saurabh Kumar 06.04.2018 22:48

mightEmitEvent - это метод MongoTemplate, из которого он публикует события для слушателя, пытается отладить его, и вы можете видеть, что это экземпляр ApplicationContext

biiyamn 06.04.2018 22:56

MongoMappingEventPublisher - это экземпляр

Saurabh Kumar 07.04.2018 00:57

Единственный случай, когда это должно быть MongoMappingEventPublisher, - это стоять только MongoTemplate вне ApplicationContext, ссылаясь на весенний документ, в этом случае будет запускаться только MappingContextEvent, поэтому BeforeConvertevent не будет запущен

biiyamn 07.04.2018 11:40

Другие вопросы по теме