删除MongoDB数据时AbstractMongoEventListener的AfterDeleteEvent未触发
可能原因及对应解决方案
1. 包导入错误
首先检查AfterDeleteEvent的导入路径是否正确,必须是:
import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent;
如果误导入了其他模块同命名的事件类,会导致方法重写失效,而onAfterSave对应的事件类导入正确所以能正常触发。
2. 泛型解析异常
AbstractMongoEventListener依赖泛型参数匹配对应实体的事件,如果你的项目存在以下场景会导致泛型识别失败:
- DomainClass存在继承关系,删除的实际是子类实例
- 项目字节码做了混淆,泛型签名被擦除
解决方案:去掉类上的泛型参数,重写方法时直接做类型判断,或者重写supports方法指定匹配的实体类:
public class ClassX extends AbstractMongoEventListener { @Override public void onAfterDelete(AfterDeleteEvent event) { if (DomainClass.class.isAssignableFrom(event.getType())) { // 执行业务逻辑 } } }
3. Spring Data MongoDB版本兼容性问题
部分低版本(低于2.1.0.RELEASE)的Spring Data MongoDB存在已知bug:调用CrudRepository.delete(T entity)方法时不会正确发布删除事件,只有deleteById、批量删除、或者直接调用MongoTemplate.remove方法才会触发事件。
解决方案:
- 升级Spring Data MongoDB到2.1.0及以上版本
- 临时替代方案:调用删除前先查询出实体,再调用
deleteById(entity.getId())执行删除
4. 多MongoTemplate配置不匹配
如果项目配置了多个MongoTemplate实例,且你的DomainClassRepository绑定的是自定义的MongoTemplate,监听器默认只会监听默认MongoTemplate发布的事件。
解决方案:给自定义MongoTemplate手动注册监听器:
@Bean public MongoTemplate customMongoTemplate(MongoDatabaseFactory mongoDatabaseFactory, ApplicationContext applicationContext) { MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory); // 绑定事件发布器,或者直接添加监听器实例 mongoTemplate.setApplicationEventPublisher(applicationContext); return mongoTemplate; }
内容的提问来源于stack exchange,提问作者jimmy
相关产品推荐
相关产品推荐

