From 1520cc1278c353587c907bf1cc5e76165357d8b8 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Thu, 18 Mar 2021 19:04:21 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=907.0.2=E3=80=91=E6=8D=A2=E4=B8=80?= =?UTF-8?q?=E7=A7=8D=E6=96=B9=E6=B3=95=E5=AE=9E=E7=8E=B0=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/CacheParamRequestBodyAdvice.java | 49 ++++++++++++++++ .../starter/{mvc => }/GunsValidator.java | 2 +- .../GunsValidatorAutoConfiguration.java | 29 ++++++++++ ...thodArgumentResolverAutoConfiguration.java | 56 ------------------ ...torRequestResponseBodyMethodProcessor.java | 57 ------------------- .../validator/starter/mvc/package-info.java | 4 -- .../main/resources/META-INF/spring.factories | 2 +- 7 files changed, 80 insertions(+), 119 deletions(-) create mode 100644 kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/CacheParamRequestBodyAdvice.java rename kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/{mvc => }/GunsValidator.java (95%) create mode 100644 kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidatorAutoConfiguration.java delete mode 100644 kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/MethodArgumentResolverAutoConfiguration.java delete mode 100644 kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidatorRequestResponseBodyMethodProcessor.java delete mode 100644 kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/package-info.java diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/CacheParamRequestBodyAdvice.java b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/CacheParamRequestBodyAdvice.java new file mode 100644 index 000000000..0f343a8ae --- /dev/null +++ b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/CacheParamRequestBodyAdvice.java @@ -0,0 +1,49 @@ +package cn.stylefeng.roses.kernel.validator.starter; + +import cn.stylefeng.roses.kernel.validator.api.context.RequestParamContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.MethodParameter; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; + +import java.io.IOException; +import java.lang.reflect.Type; + +/** + * 请求参数增强,缓存@RequestBody的请求参数 + * + * @author fengshuonan + * @date 2021/3/18 18:42 + */ +@ControllerAdvice +@Slf4j +@SuppressWarnings("all") +public class CacheParamRequestBodyAdvice implements RequestBodyAdvice { + + @Override + public boolean supports(MethodParameter methodParameter, Type targetType, Class> converterType) { + return true; + } + + @Override + public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) throws IOException { + return inputMessage; + } + + @Override + public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + + // 临时缓存一下@RequestBody注解上的参数 + RequestParamContext.setObject(body); + + return body; + } + + @Override + public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + return body; + } + +} diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidator.java b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidator.java similarity index 95% rename from kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidator.java rename to kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidator.java index d0ea895bb..f9251ebd5 100644 --- a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidator.java +++ b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidator.java @@ -1,4 +1,4 @@ -package cn.stylefeng.roses.kernel.validator.starter.mvc; +package cn.stylefeng.roses.kernel.validator.starter; import cn.stylefeng.roses.kernel.validator.api.context.RequestGroupContext; import lombok.extern.slf4j.Slf4j; diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidatorAutoConfiguration.java b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidatorAutoConfiguration.java new file mode 100644 index 000000000..bdb1f45af --- /dev/null +++ b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/GunsValidatorAutoConfiguration.java @@ -0,0 +1,29 @@ +package cn.stylefeng.roses.kernel.validator.starter; + +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Guns的校验器的自动配置 + * + * @author fengshuonan + * @date 2021/3/18 16:03 + */ +@Configuration +@AutoConfigureBefore(ValidationAutoConfiguration.class) +public class GunsValidatorAutoConfiguration { + + /** + * 自定义的spring参数校验器,重写主要为了保存一些在自定义validator中读不到的属性 + * + * @author fengshuonan + * @date 2020/8/12 20:18 + */ + @Bean + public GunsValidator gunsValidator() { + return new GunsValidator(); + } + +} diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/MethodArgumentResolverAutoConfiguration.java b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/MethodArgumentResolverAutoConfiguration.java deleted file mode 100644 index 49d32564d..000000000 --- a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/MethodArgumentResolverAutoConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -package cn.stylefeng.roses.kernel.validator.starter; - -import cn.stylefeng.roses.kernel.validator.starter.mvc.GunsValidator; -import cn.stylefeng.roses.kernel.validator.starter.mvc.GunsValidatorRequestResponseBodyMethodProcessor; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * 自定义的GunsRequestResponseBodyMethodProcessor,放在所有resolvers之前 - * - * @author fengshuonan - * @date 2020/8/21 21:09 - */ -@Configuration -@AutoConfigureBefore(ValidationAutoConfiguration.class) -public class MethodArgumentResolverAutoConfiguration { - - @Resource - private RequestMappingHandlerAdapter adapter; - - /** - * 自定义的spring参数校验器,重写主要为了保存一些在自定义validator中读不到的属性 - * - * @author fengshuonan - * @date 2020/8/12 20:18 - */ - @Bean - public GunsValidator gunsValidator() { - return new GunsValidator(); - } - - /** - * 自定义的GunsRequestResponseBodyMethodProcessor,放在所有resolvers之前 - * - * @author fengshuonan - * @date 2020/12/16 18:34 - */ - @PostConstruct - public void injectSelfMethodArgumentResolver() { - List argumentResolvers = new ArrayList<>(); - argumentResolvers.add(new GunsValidatorRequestResponseBodyMethodProcessor(adapter.getMessageConverters())); - argumentResolvers.addAll(Objects.requireNonNull(adapter.getArgumentResolvers())); - adapter.setArgumentResolvers(argumentResolvers); - } - -} diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidatorRequestResponseBodyMethodProcessor.java b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidatorRequestResponseBodyMethodProcessor.java deleted file mode 100644 index 49ec81ced..000000000 --- a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/GunsValidatorRequestResponseBodyMethodProcessor.java +++ /dev/null @@ -1,57 +0,0 @@ -package cn.stylefeng.roses.kernel.validator.starter.mvc; - -import cn.stylefeng.roses.kernel.validator.api.context.RequestParamContext; -import org.springframework.core.Conventions; -import org.springframework.core.MethodParameter; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.lang.Nullable; -import org.springframework.validation.BindingResult; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.ModelAndViewContainer; -import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor; - -import java.util.List; - -/** - * 拓展原有RequestResponseBodyMethodProcessor,只为缓存临时参数 - * - * @author fengshuonan - * @date 2020/8/21 20:51 - */ -public class GunsValidatorRequestResponseBodyMethodProcessor extends RequestResponseBodyMethodProcessor { - - public GunsValidatorRequestResponseBodyMethodProcessor(List> converters) { - super(converters); - } - - @Override - public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { - - parameter = parameter.nestedIfOptional(); - Object arg = readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType()); - - // 临时缓存一下@RequestBody注解上的参数 - RequestParamContext.setObject(arg); - - String name = Conventions.getVariableNameForParameter(parameter); - - if (binderFactory != null) { - WebDataBinder binder = binderFactory.createBinder(webRequest, arg, name); - if (arg != null) { - validateIfApplicable(binder, parameter); - if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) { - throw new MethodArgumentNotValidException(parameter, binder.getBindingResult()); - } - } - if (mavContainer != null) { - mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult()); - } - } - - return adaptArgumentIfNecessary(arg, parameter); - } - -} diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/package-info.java b/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/package-info.java deleted file mode 100644 index a16a437dc..000000000 --- a/kernel-d-validator/validator-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/validator/starter/mvc/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 这个包内容是对spring mvc原有的一些机制的拓展,为了方便校验器对 RequestGroupContext 之类的上下文添值 - */ -package cn.stylefeng.roses.kernel.validator.starter.mvc; diff --git a/kernel-d-validator/validator-spring-boot-starter/src/main/resources/META-INF/spring.factories b/kernel-d-validator/validator-spring-boot-starter/src/main/resources/META-INF/spring.factories index f52bdbe1d..dd72ebb8f 100644 --- a/kernel-d-validator/validator-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/kernel-d-validator/validator-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -cn.stylefeng.roses.kernel.validator.starter.MethodArgumentResolverAutoConfiguration +cn.stylefeng.roses.kernel.validator.starter.GunsValidatorAutoConfiguration