MongoPlus逻辑删除报错
报错信息:
Caused by: java.lang.NoSuchMethodException: com.anwen.mongo.execute.instance.SessionExecute.executeUpdate(org.bson.conversions.Bson,org.bson.conversions.Bson,com.mongodb.client.MongoCollection)
解决方案
自定义逻辑删除替换器
1. 创建替换器类CustomLogicRemoveReplacer
import com.anwen.mongo.cache.global.CollectionLogicDeleteCache;
import com.anwen.mongo.enums.ExecuteMethodEnum;
import com.anwen.mongo.enums.SpecialConditionEnum;
import com.anwen.mongo.execute.Execute;
import com.anwen.mongo.logic.LogicDeleteHandler;
import com.anwen.mongo.model.LogicDeleteResult;
import com.anwen.mongo.model.MutablePair;
import com.anwen.mongo.replacer.Replacer;
import com.anwen.mongo.support.BoolFunction;
import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.Objects;
public class CustomLogicRemoveReplacer implements Replacer {
@Override
@SuppressWarnings("unchecked")
public Object invoke(Object proxy, Object target, Method method, Object[] args) throws Throwable {
if (CollectionLogicDeleteCache.getLogicIgnore()) {
return method.invoke(target, args);
}
MongoCollection<Document> collection = (MongoCollection<Document>) args[1];
Class<?> clazz = LogicDeleteHandler.getBeanClass(collection);
if (Objects.isNull(clazz)) {
return method.invoke(target, args);
}
LogicDeleteResult result = LogicDeleteHandler.mapper().get(clazz);
if (Objects.isNull(result)) {
return method.invoke(target, args);
}
Execute execute = (Execute) target;
Document updateBasic = new Document(result.getColumn(), result.getLogicDeleteValue());
BasicDBObject update = new BasicDBObject(SpecialConditionEnum.SET.getCondition(), updateBasic);
UpdateResult updateResult = execute.executeUpdate(
Collections.singletonList(new MutablePair<>((Bson) args[0], update)), collection
);
return new DeleteResult() {
@Override
public boolean wasAcknowledged() {
return updateResult.wasAcknowledged();
}
@Override
public long getDeletedCount() {
return updateResult.getModifiedCount();
}
};
}
@Override
public BoolFunction supplier() {
return (proxy, target, method, args) -> CollectionLogicDeleteCache.open && method.getName().equals(ExecuteMethodEnum.REMOVE.getMethod());
}
}
2. 创建逻辑删除配置类LogicConfiguration
import com.anwen.mongo.cache.global.ExecutorReplacerCache;
import com.anwen.mongo.config.MongoPlusAutoConfiguration;
import com.anwen.mongo.logic.replacer.LogicRemoveReplacer;
import com.anwen.mongo.model.LogicProperty;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LogicConfiguration {
private final LogicProperty logicProperty;
public LogicConfiguration(LogicProperty logicProperty, MongoPlusAutoConfiguration ignoredMongoPlusAutoConfiguration) {
this.logicProperty = logicProperty;
setLogic();
}
private void setLogic(){
if (logicProperty.getOpen()) {
ExecutorReplacerCache.replacers.removeIf(next -> next instanceof LogicRemoveReplacer);
ExecutorReplacerCache.replacers.add(new CustomLogicRemoveReplacer());
ExecutorReplacerCache.sorted();
}
}
}
至此 问题解决