From 2208dbd0282964aab76b02e811d6689ba69d75fd Mon Sep 17 00:00:00 2001 From: Charles7c Date: Thu, 5 Sep 2024 19:54:19 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=20graceful-response=204.0.1-boot3=20=3D>=205.0.0-boot3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- continew-starter-dependencies/pom.xml | 2 +- ...aultBeforeControllerAdviceProcessImpl.java | 47 ++++++ .../GlobalResponseAutoConfiguration.java | 153 +++++++++++++----- .../src/main/resources/default-web.yml | 2 + 4 files changed, 159 insertions(+), 45 deletions(-) create mode 100644 continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/DefaultBeforeControllerAdviceProcessImpl.java diff --git a/continew-starter-dependencies/pom.xml b/continew-starter-dependencies/pom.xml index ff4d6309..2f035f34 100644 --- a/continew-starter-dependencies/pom.xml +++ b/continew-starter-dependencies/pom.xml @@ -61,7 +61,7 @@ 15.4 2.2.0 1.12.761 - 4.0.1-boot3 + 5.0.0-boot3 2.9.0 4.5.0 1.5.2 diff --git a/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/DefaultBeforeControllerAdviceProcessImpl.java b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/DefaultBeforeControllerAdviceProcessImpl.java new file mode 100644 index 00000000..60c3dd7d --- /dev/null +++ b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/DefaultBeforeControllerAdviceProcessImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.continew.starter.web.autoconfigure.response; + +import com.feiniaojin.gracefulresponse.advice.lifecycle.exception.BeforeControllerAdviceProcess; +import jakarta.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import top.continew.starter.web.util.SpringWebUtils; + +/** + * 默认回调处理器实现 + * + * @author Charles7c + * @since 2.6.0 + */ +public class DefaultBeforeControllerAdviceProcessImpl implements BeforeControllerAdviceProcess { + + private final Logger log = LoggerFactory.getLogger(DefaultBeforeControllerAdviceProcessImpl.class); + private final GlobalResponseProperties globalResponseProperties; + + public DefaultBeforeControllerAdviceProcessImpl(GlobalResponseProperties globalResponseProperties) { + this.globalResponseProperties = globalResponseProperties; + } + + @Override + public void call(Throwable throwable) { + if (globalResponseProperties.isPrintExceptionInGlobalAdvice()) { + HttpServletRequest request = SpringWebUtils.getRequest(); + log.error("[{}] {}", request.getMethod(), request.getRequestURI(), throwable); + } + } +} diff --git a/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/GlobalResponseAutoConfiguration.java b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/GlobalResponseAutoConfiguration.java index e78cc0ae..ceb770f5 100644 --- a/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/GlobalResponseAutoConfiguration.java +++ b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/response/GlobalResponseAutoConfiguration.java @@ -18,6 +18,9 @@ package top.continew.starter.web.autoconfigure.response; import com.feiniaojin.gracefulresponse.ExceptionAliasRegister; import com.feiniaojin.gracefulresponse.advice.*; +import com.feiniaojin.gracefulresponse.advice.lifecycle.exception.BeforeControllerAdviceProcess; +import com.feiniaojin.gracefulresponse.advice.lifecycle.exception.ControllerAdvicePredicate; +import com.feiniaojin.gracefulresponse.advice.lifecycle.response.ResponseBodyAdvicePredicate; import com.feiniaojin.gracefulresponse.api.ResponseFactory; import com.feiniaojin.gracefulresponse.api.ResponseStatusFactory; import com.feiniaojin.gracefulresponse.defaults.DefaultResponseFactory; @@ -37,6 +40,7 @@ import top.continew.starter.core.constant.PropertiesConstants; import top.continew.starter.core.util.GeneralPropertySourceFactory; import java.util.Locale; +import java.util.concurrent.CopyOnWriteArrayList; /** * 全局响应自动配置 @@ -56,31 +60,18 @@ public class GlobalResponseAutoConfiguration { this.globalResponseProperties = globalResponseProperties; } - /** - * 全局异常处理 - */ - @Bean - @ConditionalOnMissingBean - public GrGlobalExceptionAdvice globalExceptionAdvice() { - return new GrGlobalExceptionAdvice(); - } - - /** - * 全局校验异常处理 - */ - @Bean - @ConditionalOnMissingBean - public GrValidationExceptionAdvice validationExceptionAdvice() { - return new GrValidationExceptionAdvice(); - } - /** * 全局响应体处理(非 void) */ @Bean @ConditionalOnMissingBean - public GrNotVoidResponseBodyAdvice notVoidResponseBodyAdvice() { - return new GrNotVoidResponseBodyAdvice(); + public GrNotVoidResponseBodyAdvice grNotVoidResponseBodyAdvice() { + GrNotVoidResponseBodyAdvice notVoidResponseBodyAdvice = new GrNotVoidResponseBodyAdvice(); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(notVoidResponseBodyAdvice); + notVoidResponseBodyAdvice.setPredicates(copyOnWriteArrayList); + notVoidResponseBodyAdvice.setResponseBodyAdviceProcessor(notVoidResponseBodyAdvice); + return notVoidResponseBodyAdvice; } /** @@ -88,8 +79,104 @@ public class GlobalResponseAutoConfiguration { */ @Bean @ConditionalOnMissingBean - public GrVoidResponseBodyAdvice voidResponseBodyAdvice() { - return new GrVoidResponseBodyAdvice(); + public GrVoidResponseBodyAdvice grVoidResponseBodyAdvice() { + GrVoidResponseBodyAdvice voidResponseBodyAdvice = new GrVoidResponseBodyAdvice(); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(voidResponseBodyAdvice); + voidResponseBodyAdvice.setPredicates(copyOnWriteArrayList); + voidResponseBodyAdvice.setResponseBodyAdviceProcessor(voidResponseBodyAdvice); + return voidResponseBodyAdvice; + } + + /** + * 处理前回调(目前仅打印异常日志) + */ + @Bean + @ConditionalOnMissingBean + public BeforeControllerAdviceProcess beforeControllerAdviceProcess() { + return new DefaultBeforeControllerAdviceProcessImpl(globalResponseProperties); + } + + /** + * 框架异常处理器 + */ + @Bean + public FrameworkExceptionAdvice frameworkExceptionAdvice(BeforeControllerAdviceProcess beforeControllerAdviceProcess) { + FrameworkExceptionAdvice frameworkExceptionAdvice = new FrameworkExceptionAdvice(); + frameworkExceptionAdvice.setRejectStrategy(new DefaultRejectStrategyImpl()); + frameworkExceptionAdvice.setControllerAdviceProcessor(frameworkExceptionAdvice); + frameworkExceptionAdvice.setBeforeControllerAdviceProcess(beforeControllerAdviceProcess); + frameworkExceptionAdvice.setControllerAdviceHttpProcessor(frameworkExceptionAdvice); + return frameworkExceptionAdvice; + } + + /** + * 数据校验异常处理器 + */ + @Bean + public DataExceptionAdvice dataExceptionAdvice(BeforeControllerAdviceProcess beforeControllerAdviceProcess) { + DataExceptionAdvice dataExceptionAdvice = new DataExceptionAdvice(); + dataExceptionAdvice.setRejectStrategy(new DefaultRejectStrategyImpl()); + dataExceptionAdvice.setControllerAdviceProcessor(dataExceptionAdvice); + dataExceptionAdvice.setBeforeControllerAdviceProcess(beforeControllerAdviceProcess); + dataExceptionAdvice.setControllerAdviceHttpProcessor(dataExceptionAdvice); + return dataExceptionAdvice; + } + + /** + * 默认全局异常处理器 + */ + @Bean + public DefaultGlobalExceptionAdvice defaultGlobalExceptionAdvice(BeforeControllerAdviceProcess beforeControllerAdviceProcess) { + DefaultGlobalExceptionAdvice advice = new DefaultGlobalExceptionAdvice(); + advice.setRejectStrategy(new DefaultRejectStrategyImpl()); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(advice); + advice.setPredicates(copyOnWriteArrayList); + advice.setControllerAdviceProcessor(advice); + advice.setBeforeControllerAdviceProcess(beforeControllerAdviceProcess); + advice.setControllerAdviceHttpProcessor(advice); + return advice; + } + + /** + * 默认参数校验异常处理器 + */ + @Bean + public DefaultValidationExceptionAdvice defaultValidationExceptionAdvice(BeforeControllerAdviceProcess beforeControllerAdviceProcess) { + DefaultValidationExceptionAdvice advice = new DefaultValidationExceptionAdvice(); + advice.setRejectStrategy(new DefaultRejectStrategyImpl()); + advice.setControllerAdviceProcessor(advice); + advice.setBeforeControllerAdviceProcess(beforeControllerAdviceProcess); + advice.setControllerAdviceHttpProcessor(advice); + return advice; + } + + /** + * 国际化支持 + */ + @Bean + @ConditionalOnProperty(prefix = PropertiesConstants.WEB_RESPONSE, name = "i18n", havingValue = "true") + public GrI18nResponseBodyAdvice grI18nResponseBodyAdvice() { + GrI18nResponseBodyAdvice i18nResponseBodyAdvice = new GrI18nResponseBodyAdvice(); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(i18nResponseBodyAdvice); + i18nResponseBodyAdvice.setPredicates(copyOnWriteArrayList); + i18nResponseBodyAdvice.setResponseBodyAdviceProcessor(i18nResponseBodyAdvice); + return i18nResponseBodyAdvice; + } + + /** + * 国际化配置 + */ + @Bean + @ConditionalOnProperty(prefix = PropertiesConstants.WEB_RESPONSE, name = "i18n", havingValue = "true") + public MessageSource messageSource() { + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + messageSource.setBasenames("i18n", "i18n/empty-messages"); + messageSource.setDefaultEncoding("UTF-8"); + messageSource.setDefaultLocale(Locale.CHINA); + return messageSource; } /** @@ -126,28 +213,6 @@ public class GlobalResponseAutoConfiguration { return new AdviceSupport(); } - /** - * 国际化支持 - */ - @Bean - @ConditionalOnProperty(prefix = PropertiesConstants.WEB_RESPONSE, name = "i18n", havingValue = "true") - public GrI18nAdvice i18nAdvice() { - return new GrI18nAdvice(); - } - - /** - * 国际化配置 - */ - @Bean - @ConditionalOnProperty(prefix = PropertiesConstants.WEB_RESPONSE, name = "i18n", havingValue = "true") - public MessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasenames("i18n", "i18n/empty-messages"); - messageSource.setDefaultEncoding("UTF-8"); - messageSource.setDefaultLocale(Locale.CHINA); - return messageSource; - } - /** * SpringDoc 全局响应处理器 * diff --git a/continew-starter-web/src/main/resources/default-web.yml b/continew-starter-web/src/main/resources/default-web.yml index 111325ce..611d9339 100644 --- a/continew-starter-web/src/main/resources/default-web.yml +++ b/continew-starter-web/src/main/resources/default-web.yml @@ -4,6 +4,8 @@ continew-starter.web.response: i18n: false # 响应类全名(配置后 response-style 将不再生效) response-class-full-name: top.continew.starter.web.model.R + # 自定义失败 HTTP 状态码(默认:200,建议业务和通信状态码区分) + default-http-status-code-on-error: 200 # 自定义成功响应码(默认:0) default-success-code: 0 # 自定义成功提示(默认:ok)