首页 > 解决方案 > 拦截对 MongoDB Spring Boot 的所有写调用

问题描述

我正在与Spring Boot 2.1.5. 我正在尝试编写一个服务来拦截对 MongoDB 的所有写调用。基本上类似于 DBMS 中的操作日志,在任何数据被写入 DB 甚至更新或删除之前,我会捕获正在更新或创建的文档。

这甚至可能吗?如果有怎么办?

它用于从我的应用程序中进行的数据库调用。因为您看到假设您有一个包含大约 100 个 API 的大型应用程序,所以很难在所有 API 控制器或服务中实际集成 OpLog(数据库更新、写入、删除),而是编写一个在函数之前触发的拦截器或方面MongoRepository 或 MongoTemplate 被调用。

标签: javaspring-bootspring-data-mongodb

解决方案


您可以扩展 org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener 并实现您的自定义侦听器。

是相关的春季文档。

AbstractMappingEventListener 中存在以下回调方法:

onBeforeConvert:在对象被 MongoConverter 转换为 Document 之前,在 MongoTemplate 的 insert、insertList 和 save 操作中调用。

onBeforeSave:在将 Document 插入或保存到数据库之前,在 MongoTemplate 的 insert、insertList 和 save 操作中调用。

onAfterSave:在将 Document 插入或保存到数据库后,在 MongoTemplate 的 insert、insertList 和 save 操作中调用。

onAfterLoad:在从数据库中检索到 Document 后,在 MongoTemplate 的 find、findAndRemove、findOne 和 getCollection 方法中调用。

onAfterConvert:在从数据库中检索到 Document 并转换为 POJO 后,在 MongoTemplate 中调用 find、findAndRemove、findOne 和 getCollection 方法。

如果要记录所有操作,可以定义一个 org.springframework.data.mongodb.core.mapping.event.LoggingEventListener 的 bean。

@Configuration
public class MongoConfig {

    @Bean
    public LoggingEventListener<Object> listener(){
        return new LoggingEventListener();
    }
}

推荐阅读