允许覆盖应用接口

This commit is contained in:
mxd 2022-01-06 21:56:40 +08:00
parent 77d403e123
commit 72bda060e6
5 changed files with 40 additions and 5 deletions

View File

@ -361,7 +361,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon
@Bean
@ConditionalOnMissingBean
public RequestMagicDynamicRegistry magicRequestMagicDynamicRegistry(ApiInfoMagicResourceStorage apiInfoMagicResourceStorage) throws NoSuchMethodException {
return new RequestMagicDynamicRegistry(apiInfoMagicResourceStorage, Mapping.create(requestMappingHandlerMapping, properties.getWeb(), properties.getPrefix()));
return new RequestMagicDynamicRegistry(apiInfoMagicResourceStorage, Mapping.create(requestMappingHandlerMapping, properties.getWeb(), properties.getPrefix()), properties.isAllowOverride());
}
@Bean

View File

@ -39,6 +39,8 @@ public interface JsonCodeConstants {
JsonCode FUNCTION_PATH_REQUIRED = new JsonCode(0, "函数路径不能为空");
JsonCode REQUEST_PATH_CONFLICT = new JsonCode(0, "接口[{}({})]与应用冲突,无法注册");
JsonCode SCRIPT_REQUIRED = new JsonCode(0, "脚本内容不能为空");
JsonCode NAME_REQUIRED = new JsonCode(0, "名称不能为空");

View File

@ -1,6 +1,8 @@
package org.ssssssss.magicapi.service.impl;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
@ -25,6 +27,8 @@ public class DataSourceMagicDynamicRegistry extends AbstractMagicDynamicRegistry
private final MagicDynamicDataSource magicDynamicDataSource;
private static final Logger logger = LoggerFactory.getLogger(DataSourceMagicDynamicRegistry.class);
private static final ClassLoader CLASSLOADER = DataSourceMagicDynamicRegistry.class.getClassLoader();
// copy from DataSourceBuilder
@ -40,7 +44,11 @@ public class DataSourceMagicDynamicRegistry extends AbstractMagicDynamicRegistry
@EventListener(condition = "#event.type == 'datasource'")
public void onFileEvent(FileEvent event) {
processEvent(event);
try {
processEvent(event);
} catch (Exception e) {
logger.error("注册数据源失败", e);
}
}
@Override

View File

@ -1,6 +1,8 @@
package org.ssssssss.magicapi.service.impl;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationListener;
@ -49,6 +51,8 @@ public class DefaultMagicResourceService implements MagicResourceService, JsonCo
private final ApplicationEventPublisher publisher;
private final Logger logger = LoggerFactory.getLogger(DefaultMagicResourceService.class);
public DefaultMagicResourceService(Resource resource, List<MagicResourceStorage<? extends MagicEntity>> storages, ApplicationEventPublisher publisher) {
this.root = resource;
this.storages = storages.stream()
@ -800,6 +804,10 @@ public class DefaultMagicResourceService implements MagicResourceService, JsonCo
@Override
public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
this.read();
try {
this.read();
} catch (Exception e) {
logger.error("启动过程中发生异常", e);
}
}
}

View File

@ -3,11 +3,13 @@ package org.ssssssss.magicapi.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.event.EventListener;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.ssssssss.magicapi.controller.RequestHandler;
import org.ssssssss.magicapi.event.FileEvent;
import org.ssssssss.magicapi.event.GroupEvent;
import org.ssssssss.magicapi.exception.InvalidArgumentException;
import org.ssssssss.magicapi.model.ApiInfo;
import org.ssssssss.magicapi.provider.MagicResourceStorage;
import org.ssssssss.magicapi.script.ScriptManager;
@ -26,6 +28,8 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import static org.ssssssss.magicapi.model.JsonCodeConstants.REQUEST_PATH_CONFLICT;
public class RequestMagicDynamicRegistry extends AbstractMagicDynamicRegistry<ApiInfo> {
private final Mapping mapping;
@ -36,9 +40,12 @@ public class RequestMagicDynamicRegistry extends AbstractMagicDynamicRegistry<Ap
private static final Logger logger = LoggerFactory.getLogger(RequestMagicDynamicRegistry.class);
public RequestMagicDynamicRegistry(MagicResourceStorage<ApiInfo> magicResourceStorage, Mapping mapping) throws NoSuchMethodException {
private final boolean allowOverride;
public RequestMagicDynamicRegistry(MagicResourceStorage<ApiInfo> magicResourceStorage, Mapping mapping, boolean allowOverride) throws NoSuchMethodException {
super(magicResourceStorage);
this.mapping = mapping;
this.allowOverride = allowOverride;
MagicResourceLoader.addFunctionLoader(this::lookupLambdaFunction);
}
@ -93,7 +100,17 @@ public class RequestMagicDynamicRegistry extends AbstractMagicDynamicRegistry<Ap
int index = mappingKey.indexOf(":");
String requestMethod = mappingKey.substring(0, index);
String path = mappingKey.substring(index + 1);
mappingNode.setMappingData(mapping.register(requestMethod, path, handler, method));
RequestMappingInfo requestMappingInfo = mapping.paths(path).methods(RequestMethod.valueOf(requestMethod.toUpperCase())).build();
if (mapping.getHandlerMethods().containsKey(requestMappingInfo)) {
if (!allowOverride) {
logger.error("接口[{}({})]与应用冲突,无法注册", mappingNode.getEntity().getName(), mappingKey);
throw new InvalidArgumentException(REQUEST_PATH_CONFLICT.format(mappingNode.getEntity().getName(),mappingKey));
}
logger.warn("取消注册应用接口:{}", requestMappingInfo);
// 取消注册原接口
mapping.unregister(requestMappingInfo);
}
mappingNode.setMappingData(mapping.register(requestMappingInfo, handler, method));
return true;
}