我有一个扩展AbstractMongoEventListener
并覆盖onAfterSave
和onAfterDelete
的类。
onAfterDelete
不触发。onAfterSave
工作良好。是否需要为它做一个不同的配置?
public class ClassX extends AbstractMongoEventListener<DomainClass> {
@Override
public void onAfterSave(AfterSaveEvent<DomainClass> event) {
//dosomething
}
@Override
public void onAfterDelete(AfterDeleteEvent<DomainClass> event) {
//dosomething
}
}
我已经检查了数据库和数据被正确删除,但onAfterDelete仍然没有被调用。
有什么问题吗?
存储库:
public interface DomainClassRepository extends MongoRepository<DomainClass, String> {
}
我正在调用DomainClassRepository.delete(instanceOfDomainClass)
方法来删除数据库中的条目。
简短回答:
Mongo事件只能用类型化查询触发。
我试过spring-data-mongodb-2.2.8
版本,它可以正确处理DomainClassRepository.delete(instanceOfDomainClass)
和DomainClassRepository.deleteById(idOfDomainClass)
。
方法onAfterDelete
不能在DomainClassRepository.deleteAll()
被调用时被触发,因为它是无类型的。
长篇大论(Research):
检查AbstractMongoEventListener
中的onApplicationEvent
方法。它包含以下代码块:
if (event instanceof AbstractDeleteEvent) {
Class<?> eventDomainType = ((AbstractDeleteEvent) event).getType();
if (eventDomainType != null && domainClass.isAssignableFrom(eventDomainType)) {
if (event instanceof BeforeDeleteEvent) {
onBeforeDelete((BeforeDeleteEvent<E>) event);
}
if (event instanceof AfterDeleteEvent) {
onAfterDelete((AfterDeleteEvent<E>) event);
}
}
return;
}
检查org.springframework.data.mongodb.core.mapping.event
包下的AbstractDeleteEvent
。构造函数允许有可空类型:
/**
* Creates a new {@link AbstractDeleteEvent} for the given {@link Document} and type.
*
* @param document must not be {@literal null}.
* @param type may be {@literal null}.
* @param collectionName must not be {@literal null}.
* @since 1.8
*/
public AbstractDeleteEvent(Document document, @Nullable Class<T> type, String collectionName) {
super(document, document, collectionName);
this.type = type;
}