Forráskód Böngészése

优化参数验证

mxd 4 éve
szülő
commit
682fc80519

+ 31 - 18
magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java

@@ -109,11 +109,15 @@ public class RequestHandler extends MagicController {
 				BaseDefinition body = JsonUtils.readValue(requestBody, BaseDefinition.class);
 				Object bodyValue = context.get(VAR_NAME_REQUEST_BODY);
 				body.setName("root");
-				doValidate(VAR_NAME_REQUEST_BODY, Collections.singletonList(body), Collections.singletonMap(body.getName(), bodyValue), BODY_INVALID);
+				doValidate(VAR_NAME_REQUEST_BODY, Collections.singletonList(body), new HashMap<String, Object>() {{
+					put(body.getName(), bodyValue);
+				}}, BODY_INVALID);
 			}
 		} catch (ValidateException e) {
 			Object value = resultProvider.buildResult(requestEntity, RESPONSE_CODE_INVALID, e.getMessage());
 			return requestEntity.isRequestedFromTest() ? new JsonBean<>(e.getJsonCode(), value) : value;
+		} catch (Throwable root) {
+			return processException(requestEntity, root);
 		}
 		requestEntity.setMagicScriptContext(context);
 		RequestContext.setRequestEntity(requestEntity);
@@ -168,7 +172,9 @@ public class RequestHandler extends MagicController {
 				if (list != null) {
 					for (Object value : list) {
 						List<BaseDefinition> definitions = parameter.getChildren();
-						doValidate(VAR_NAME_REQUEST_BODY, definitions, Collections.singletonMap("", value), jsonCode);
+						doValidate(VAR_NAME_REQUEST_BODY, definitions, new HashMap<String, Object>() {{
+							put("", value);
+						}}, jsonCode);
 					}
 				}
 
@@ -200,10 +206,13 @@ public class RequestHandler extends MagicController {
 			MagicScriptContext context = new MagicScriptContext();
 			// 将其他参数也放置脚本中,以实现“依赖”的情况
 			context.putMapIntoContext(parameters);
-			// 设置自身变量
-			context.set(EXPRESSION_DEFAULT_VAR_NAME, parameters.get(parameter.getName()));
-			if (!BooleanLiteral.isTrue(ScriptManager.executeExpression(parameter.getExpression(), context))) {
-				throw new ValidateException(jsonCode, StringUtils.defaultIfBlank(parameter.getError(), String.format("%s[%s]不满足表达式", comment, parameter.getName())));
+			Object value = parameters.get(parameter.getName());
+			if (value != null) {
+				// 设置自身变量
+				context.set(EXPRESSION_DEFAULT_VAR_NAME, value);
+				if (!BooleanLiteral.isTrue(ScriptManager.executeExpression(parameter.getExpression(), context))) {
+					throw new ValidateException(jsonCode, StringUtils.defaultIfBlank(parameter.getError(), String.format("%s[%s]不满足表达式", comment, parameter.getName())));
+				}
 			}
 		}
 	}
@@ -309,23 +318,27 @@ public class RequestHandler extends MagicController {
 			// 对返回结果包装处理
 			return response(requestEntity, result);
 		} catch (Throwable root) {
-			Throwable parent = root;
-			do {
-				if (parent instanceof MagicScriptAssertException) {
-					MagicScriptAssertException sae = (MagicScriptAssertException) parent;
-					return resultProvider.buildResult(requestEntity, sae.getCode(), sae.getMessage());
-				}
-			} while ((parent = parent.getCause()) != null);
-			if (configuration.isThrowException()) {
-				throw root;
-			}
-			logger.error("接口{}请求出错", request.getRequestURI(), root);
-			return resultProvider.buildException(requestEntity, root);
+			return processException(requestEntity, root);
 		} finally {
 			RequestContext.remove();
 		}
 	}
 
+	private Object processException(RequestEntity requestEntity, Throwable root) throws Throwable {
+		Throwable parent = root;
+		do {
+			if (parent instanceof MagicScriptAssertException) {
+				MagicScriptAssertException sae = (MagicScriptAssertException) parent;
+				return resultProvider.buildResult(requestEntity, sae.getCode(), sae.getMessage());
+			}
+		} while ((parent = parent.getCause()) != null);
+		if (configuration.isThrowException()) {
+			throw root;
+		}
+		logger.error("接口{}请求出错", requestEntity.getRequest().getRequestURI(), root);
+		return resultProvider.buildException(requestEntity, root);
+	}
+
 	/**
 	 * 转换请求结果
 	 */