Why does Spring Data MongoDB not expose events for update…(…) methods?

后端 未结 3 1660
情话喂你
情话喂你 2021-01-07 09:37

It appears that the update for mongoOperations do not trigger the events in AbstractMongoEventListener.

This post indicates that wa

3条回答
  •  盖世英雄少女心
    2021-01-07 09:46

    I know it's too late to answer this Question, I have the same situation with MongoTemplate.findAndModify method and the reason I needed events is for Auditing purpose. here is what i did.

    1.EventPublisher (which is ofc MongoTemplate's methods)

    public class CustomMongoTemplate extends MongoTemplate {
    
        private ApplicationEventPublisher applicationEventPublisher;
    
    
        @Autowired
        public void setApplicationEventPublisher(ApplicationEventPublisher
                                                             applicationEventPublisher) {
            this.applicationEventPublisher = applicationEventPublisher;
        }
    
       //Default Constructor here
    
        @Override
        public  T findAndModify(Query query, Update update, Class entityClass) {
            T result = super.findAndModify(query, update, entityClass);
    
            //Publishing Custom Event on findAndModify
            if(result!=null && result instanceof Parent)//All of my Domain class extends Parent
                this.applicationEventPublisher.publishEvent(new AfterFindAndModify
                        (this,((Parent)result).getId(),
                                result.getClass().toString())
                );
    
            return result;
        } }
    

    2.Application Event

    public class AfterFindAndModify extends ApplicationEvent {
    
        private DocumentAuditLog documentAuditLog;
    
        public AfterFindAndModify(Object source, String documentId,
                                String documentObject) {
            super(source);
            this.documentAuditLog = new DocumentAuditLog(documentId,
                    documentObject,new Date(),"UPDATE");
        }
    
        public DocumentAuditLog getDocumentAuditLog() {
            return documentAuditLog;
        }
    }
    

    3.Application Listener

    public class FindandUpdateMongoEventListner implements ApplicationListener {
    
        @Autowired
        MongoOperations mongoOperations;
    
        @Override
        public void onApplicationEvent(AfterFindAndModify event) {
            mongoOperations.save(event.getDocumentAuditLog());
        }
    }
    

    and then

    @Configuration
    @EnableMongoRepositories(basePackages = "my.pkg")
    @ComponentScan(basePackages = {"my.pkg"})
    public class MongoConfig extends AbstractMongoConfiguration {
    
        //.....
    
        @Bean
        public FindandUpdateMongoEventListner findandUpdateMongoEventListner(){
            return new FindandUpdateMongoEventListner();
        }   
    
    }
    

提交回复
热议问题