Sfoglia il codice sorgente

允许覆盖应用接口

mxd 3 anni fa
parent
commit
72bda060e6

+ 1 - 1
magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java

@@ -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

+ 2 - 0
magic-api/src/main/java/org/ssssssss/magicapi/model/JsonCodeConstants.java

@@ -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, "名称不能为空");

+ 9 - 1
magic-api/src/main/java/org/ssssssss/magicapi/service/impl/DataSourceMagicDynamicRegistry.java

@@ -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

+ 9 - 1
magic-api/src/main/java/org/ssssssss/magicapi/service/impl/DefaultMagicResourceService.java

@@ -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);
+		}
 	}
 }

+ 19 - 2
magic-api/src/main/java/org/ssssssss/magicapi/service/impl/RequestMagicDynamicRegistry.java

@@ -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;
 	}