浏览代码

修复在配置自动导入`log`模块时可能发生的空指针异常

mxd 3 年之前
父节点
当前提交
6ab21ec79b

+ 17 - 15
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -84,7 +84,8 @@ public class RequestHandler extends MagicController {
 		String sessionId = null;
 		boolean requestedFromTest = configuration.isEnableWeb() && (sessionId = request.getHeader(HEADER_REQUEST_SESSION)) != null;
 		RequestEntity requestEntity = new RequestEntity(request, response, requestedFromTest, parameters, pathVariables);
-		if (requestEntity.getApiInfo() == null) {
+		ApiInfo info = requestEntity.getApiInfo();
+		if (info == null) {
 			logger.error("{}找不到对应接口", request.getRequestURI());
 			return afterCompletion(requestEntity, buildResult(requestEntity, API_NOT_FOUND, "接口不存在"));
 		}
@@ -95,24 +96,25 @@ public class RequestHandler extends MagicController {
 			}
 		};
 		requestEntity.setHeaders(headers);
-		List<Path> paths = new ArrayList<>(requestEntity.getApiInfo().getPaths());
-		MappingHandlerMapping.findGroups(requestEntity.getApiInfo().getGroupId())
+		List<Path> paths = new ArrayList<>(info.getPaths());
+		MappingHandlerMapping.findGroups(info.getGroupId())
 				.stream()
 				.flatMap(it -> it.getPaths().stream())
 				.filter(it -> !paths.contains(it))
 				.forEach(paths::add);
 		Object bodyValue = readRequestBody(requestEntity.getRequest());
+		String scriptName = configuration.getGroupServiceProvider().getScriptName(info.getGroupId(), info.getName(), info.getPath());
 		try {
 			// 验证参数
-			doValidate("参数", requestEntity.getApiInfo().getParameters(), parameters, PARAMETER_INVALID);
+			doValidate(scriptName, "参数", info.getParameters(), parameters, PARAMETER_INVALID);
 			// 验证 header
-			doValidate("header", requestEntity.getApiInfo().getHeaders(), headers, HEADER_INVALID);
+			doValidate(scriptName, "header", info.getHeaders(), headers, HEADER_INVALID);
 			// 验证 path
-			doValidate("path", paths, requestEntity.getPathVariables(), PATH_VARIABLE_INVALID);
-			BaseDefinition requestBody = requestEntity.getApiInfo().getRequestBodyDefinition();
+			doValidate(scriptName, "path", paths, requestEntity.getPathVariables(), PATH_VARIABLE_INVALID);
+			BaseDefinition requestBody = info.getRequestBodyDefinition();
 			if (requestBody != null && !CollectionUtils.isEmpty(requestBody.getChildren())) {
 				requestBody.setName(StringUtils.defaultIfBlank(requestBody.getName(), "root"));
-				doValidate(VAR_NAME_REQUEST_BODY, Collections.singletonList(requestBody), new HashMap<String, Object>() {{
+				doValidate(scriptName, VAR_NAME_REQUEST_BODY, Collections.singletonList(requestBody), new HashMap<String, Object>() {{
 					put(requestBody.getName(), bodyValue);
 				}}, BODY_INVALID);
 			}
@@ -121,7 +123,7 @@ public class RequestHandler extends MagicController {
 		} catch (Throwable root) {
 			return afterCompletion(requestEntity, processException(requestEntity, root), root);
 		}
-		MagicScriptContext context = createMagicScriptContext(requestEntity, bodyValue);
+		MagicScriptContext context = createMagicScriptContext(scriptName, requestEntity, bodyValue);
 		requestEntity.setMagicScriptContext(context);
 		RequestContext.setRequestEntity(requestEntity);
 		Object value;
@@ -161,7 +163,7 @@ public class RequestHandler extends MagicController {
 		return false;
 	}
 
-	private <T extends BaseDefinition> Map<String, Object> doValidate(String comment, List<T> validateParameters, Map<String, Object> parameters, JsonCode jsonCode) {
+	private <T extends BaseDefinition> Map<String, Object> doValidate(String scriptName, String comment, List<T> validateParameters, Map<String, Object> parameters, JsonCode jsonCode) {
 		parameters = parameters != null ? parameters : EMPTY_MAP;
 		if (CollectionUtils.isEmpty(validateParameters)) {
 			return parameters;
@@ -172,14 +174,14 @@ public class RequestHandler extends MagicController {
 				if (doValidateBody(comment, parameter, parameters, jsonCode, Map.class)) {
 					continue;
 				}
-				doValidate(VAR_NAME_REQUEST_BODY, parameter.getChildren(), (Map) parameters.get(parameter.getName()), jsonCode);
+				doValidate(scriptName, VAR_NAME_REQUEST_BODY, parameter.getChildren(), (Map) parameters.get(parameter.getName()), jsonCode);
 			} else if (DataType.Array == parameter.getDataType()) {
 				if (doValidateBody(comment, parameter, parameters, jsonCode, List.class)) {
 					continue;
 				}
 				List<Object> list = (List) parameters.get(parameter.getName());
 				if (list != null) {
-					List<Map<String, Object>> newList = list.stream().map(it -> doValidate(VAR_NAME_REQUEST_BODY, parameter.getChildren(), new HashMap<String, Object>() {{
+					List<Map<String, Object>> newList = list.stream().map(it -> doValidate(scriptName, VAR_NAME_REQUEST_BODY, parameter.getChildren(), new HashMap<String, Object>() {{
 						put(EMPTY, it);
 					}}, jsonCode)).collect(Collectors.toList());
 					for (int i = 0, size = newList.size(); i < size; i++) {
@@ -226,6 +228,7 @@ public class RequestHandler extends MagicController {
 			context.putMapIntoContext(parameters);
 			Object value = parameters.get(parameter.getName());
 			if (value != null) {
+				context.setScriptName(scriptName);
 				// 设置自身变量
 				context.set(EXPRESSION_DEFAULT_VAR_NAME, value);
 				if (!BooleanLiteral.isTrue(ScriptManager.executeExpression(parameter.getExpression(), context))) {
@@ -339,7 +342,7 @@ public class RequestHandler extends MagicController {
 	/**
 	 * 构建 MagicScriptContext
 	 */
-	private MagicScriptContext createMagicScriptContext(RequestEntity requestEntity, Object requestBody) {
+	private MagicScriptContext createMagicScriptContext(String scriptName, RequestEntity requestEntity, Object requestBody) {
 		List<Integer> breakpoints = requestEntity.getRequestedBreakpoints();
 		// 构建脚本上下文
 		MagicScriptContext context;
@@ -365,8 +368,7 @@ public class RequestHandler extends MagicController {
 		if (wrap != null && StringUtils.isNotBlank(wrap.toString())) {
 			context.set(wrap.toString(), requestEntity.getParameters());
 		}
-		ApiInfo info = requestEntity.getApiInfo();
-		context.setScriptName(configuration.getGroupServiceProvider().getScriptName(info.getGroupId(), info.getName(), info.getPath()));
+		context.setScriptName(scriptName);
 		context.putMapIntoContext(requestEntity.getParameters());
 		context.putMapIntoContext(requestEntity.getPathVariables());
 		context.set(VAR_NAME_COOKIE, new CookieContext(requestEntity.getRequest()));

+ 1 - 0
magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultResultProvider.java

@@ -24,6 +24,7 @@ public class DefaultResultProvider implements ResultProvider {
 		long timestamp = System.currentTimeMillis();
 		if (this.responseScript != null) {
 			MagicScriptContext context = new MagicScriptContext();
+			context.setScriptName(requestEntity.getMagicScriptContext().getScriptName());
 			context.set("code", code);
 			context.set("message", message);
 			context.set("data", data);