From 17c9cb9dbbe27dc8c9e1ff6bd1984fe3d43f24bf Mon Sep 17 00:00:00 2001 From: mxd <838425805@qq.com> Date: Thu, 29 Jul 2021 20:02:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E4=BB=B6=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=BF=85=E5=A1=AB=E9=AA=8C=E8=AF=81=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E7=9A=84`BUG`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/MagicAPIAutoConfiguration.java | 6 ++++- .../magicapi/controller/RequestHandler.java | 10 ++++++- .../magicapi/modules/RequestModule.java | 27 ++++++++++++++----- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java index 20555b91..7e41afe4 100644 --- a/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java +++ b/magic-api-spring-boot-starter/src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java @@ -25,6 +25,7 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -142,6 +143,9 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon @Lazy private RequestMappingHandlerMapping requestMappingHandlerMapping; + @Autowired(required = false) + private MultipartResolver multipartResolver; + private final ObjectProvider restTemplateProvider; private String ALL_CLASS_TXT; @@ -457,7 +461,7 @@ public class MagicAPIAutoConfiguration implements WebMvcConfigurer, WebSocketCon logger.info("注册模块:{} -> {}", "env", EnvModule.class); MagicResourceLoader.addModule("env", new EnvModule(environment)); logger.info("注册模块:{} -> {}", "request", RequestModule.class); - MagicResourceLoader.addModule("request", new RequestModule()); + MagicResourceLoader.addModule("request", new RequestModule(multipartResolver)); logger.info("注册模块:{} -> {}", "response", ResponseModule.class); MagicResourceLoader.addModule("response", new ResponseModule(resultProvider)); logger.info("注册模块:{} -> {}", "assert", AssertModule.class); diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java b/magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java index e3c1c857..4d3a868e 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/controller/RequestHandler.java @@ -173,8 +173,9 @@ public class RequestHandler extends MagicController { } } else if (StringUtils.isNotBlank(parameter.getName()) || parameters.containsKey(parameter.getName())) { + boolean isFile = parameter.getDataType() == DataType.MultipartFile || parameter.getDataType() == DataType.MultipartFiles; String requestValue = StringUtils.defaultIfBlank(Objects.toString(parameters.get(parameter.getName()), EMPTY), Objects.toString(parameter.getDefaultValue(), EMPTY)); - if (StringUtils.isBlank(requestValue)) { + if (StringUtils.isBlank(requestValue) && !isFile) { if (!parameter.isRequired()) { continue; } @@ -182,6 +183,11 @@ public class RequestHandler extends MagicController { } try { Object value = convertValue(parameter.getDataType(), parameter.getName(), requestValue); + if (isFile && parameter.isRequired()) { + if (value == null || (parameter.getDataType() == DataType.MultipartFiles && ((List) value).isEmpty())) { + throw new ValidateException(jsonCode, StringUtils.defaultIfBlank(parameter.getError(), String.format("%s[%s]为必填项", comment, parameter.getName()))); + } + } if (VALIDATE_TYPE_PATTERN.equals(parameter.getValidateType())) { // 正则验证 String expression = parameter.getExpression(); if (StringUtils.isNotBlank(expression) && !PatternUtils.match(Objects.toString(value, EMPTY), expression)) { @@ -189,6 +195,8 @@ public class RequestHandler extends MagicController { } } parameters.put(parameter.getName(), value); + } catch (ValidateException ve) { + throw ve; } catch (Exception e) { throw new ValidateException(jsonCode, StringUtils.defaultIfBlank(parameter.getError(), String.format("%s[%s]不合法", comment, parameter.getName()))); } diff --git a/magic-api/src/main/java/org/ssssssss/magicapi/modules/RequestModule.java b/magic-api/src/main/java/org/ssssssss/magicapi/modules/RequestModule.java index 703f00e0..f90daa12 100644 --- a/magic-api/src/main/java/org/ssssssss/magicapi/modules/RequestModule.java +++ b/magic-api/src/main/java/org/ssssssss/magicapi/modules/RequestModule.java @@ -2,8 +2,7 @@ package org.ssssssss.magicapi.modules; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartRequest; -import org.springframework.web.util.WebUtils; -import org.ssssssss.magicapi.context.RequestContext; +import org.springframework.web.multipart.MultipartResolver; import org.ssssssss.script.annotation.Comment; import javax.servlet.http.HttpServletRequest; @@ -11,12 +10,19 @@ import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.List; +import java.util.stream.Collectors; /** * request 模块 */ public class RequestModule { + private static MultipartResolver resolver; + + public RequestModule(MultipartResolver resolver) { + RequestModule.resolver = resolver; + } + /** * 获取文件信息 * @@ -25,7 +31,11 @@ public class RequestModule { @Comment("获取文件") public static MultipartFile getFile(@Comment("参数名") String name) { MultipartRequest request = getMultipartHttpServletRequest(); - return request == null ? null : request.getFile(name); + if (request == null) { + return null; + } + MultipartFile file = request.getFile(name); + return file == null || file.isEmpty() ? null : file; } /** @@ -36,20 +46,23 @@ public class RequestModule { @Comment("获取多个文件") public static List getFiles(@Comment("参数名") String name) { MultipartRequest request = getMultipartHttpServletRequest(); - return request == null ? null : request.getFiles(name); + if (request == null) { + return null; + } + return request.getFiles(name).stream().filter(it -> !it.isEmpty()).collect(Collectors.toList()); } /** * 获取原生HttpServletRequest对象 */ public static HttpServletRequest get() { - return RequestContext.getHttpServletRequest(); + return org.ssssssss.magicapi.utils.WebUtils.getRequest().orElse(null); } private static MultipartRequest getMultipartHttpServletRequest() { HttpServletRequest request = get(); - if (request != null && request.getContentType() != null && request.getContentType().toLowerCase().startsWith("multipart/")) { - return WebUtils.getNativeRequest(request, MultipartRequest.class); + if (request != null && resolver.isMultipart(request)) { + return resolver.resolveMultipart(request); } return null; }