diff --git a/continew-starter-dependencies/pom.xml b/continew-starter-dependencies/pom.xml index ff4d630..2f035f3 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 0000000..60c3dd7 --- /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 e78cc0a..ceb770f 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 @@ 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.util.GeneralPropertySourceFactory; import java.util.Locale; +import java.util.concurrent.CopyOnWriteArrayList; /** * 全局响应自动配置 @@ -57,73 +61,95 @@ public GlobalResponseAutoConfiguration(GlobalResponseProperties globalResponsePr } /** - * 全局异常处理 + * 全局响应体处理(非 void) */ @Bean @ConditionalOnMissingBean - public GrGlobalExceptionAdvice globalExceptionAdvice() { - return new GrGlobalExceptionAdvice(); + public GrNotVoidResponseBodyAdvice grNotVoidResponseBodyAdvice() { + GrNotVoidResponseBodyAdvice notVoidResponseBodyAdvice = new GrNotVoidResponseBodyAdvice(); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(notVoidResponseBodyAdvice); + notVoidResponseBodyAdvice.setPredicates(copyOnWriteArrayList); + notVoidResponseBodyAdvice.setResponseBodyAdviceProcessor(notVoidResponseBodyAdvice); + return notVoidResponseBodyAdvice; } /** - * 全局校验异常处理 + * 全局响应体处理(void) */ @Bean @ConditionalOnMissingBean - public GrValidationExceptionAdvice validationExceptionAdvice() { - return new GrValidationExceptionAdvice(); + public GrVoidResponseBodyAdvice grVoidResponseBodyAdvice() { + GrVoidResponseBodyAdvice voidResponseBodyAdvice = new GrVoidResponseBodyAdvice(); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(voidResponseBodyAdvice); + voidResponseBodyAdvice.setPredicates(copyOnWriteArrayList); + voidResponseBodyAdvice.setResponseBodyAdviceProcessor(voidResponseBodyAdvice); + return voidResponseBodyAdvice; } /** - * 全局响应体处理(非 void) + * 处理前回调(目前仅打印异常日志) */ @Bean @ConditionalOnMissingBean - public GrNotVoidResponseBodyAdvice notVoidResponseBodyAdvice() { - return new GrNotVoidResponseBodyAdvice(); + public BeforeControllerAdviceProcess beforeControllerAdviceProcess() { + return new DefaultBeforeControllerAdviceProcessImpl(globalResponseProperties); } /** - * 全局响应体处理(void) + * 框架异常处理器 */ @Bean - @ConditionalOnMissingBean - public GrVoidResponseBodyAdvice voidResponseBodyAdvice() { - return new GrVoidResponseBodyAdvice(); + 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 - @ConditionalOnMissingBean - public ResponseFactory responseBeanFactory() { - return new DefaultResponseFactory(); + 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 - @ConditionalOnMissingBean - public ResponseStatusFactory responseStatusFactory() { - return new DefaultResponseStatusFactoryImpl(); + 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 ExceptionAliasRegister exceptionAliasRegister() { - return new ExceptionAliasRegister(); - } - - /** - * 响应支持 - */ - @Bean - public AdviceSupport adviceSupport() { - return new AdviceSupport(); + public DefaultValidationExceptionAdvice defaultValidationExceptionAdvice(BeforeControllerAdviceProcess beforeControllerAdviceProcess) { + DefaultValidationExceptionAdvice advice = new DefaultValidationExceptionAdvice(); + advice.setRejectStrategy(new DefaultRejectStrategyImpl()); + advice.setControllerAdviceProcessor(advice); + advice.setBeforeControllerAdviceProcess(beforeControllerAdviceProcess); + advice.setControllerAdviceHttpProcessor(advice); + return advice; } /** @@ -131,8 +157,13 @@ public AdviceSupport adviceSupport() { */ @Bean @ConditionalOnProperty(prefix = PropertiesConstants.WEB_RESPONSE, name = "i18n", havingValue = "true") - public GrI18nAdvice i18nAdvice() { - return new GrI18nAdvice(); + public GrI18nResponseBodyAdvice grI18nResponseBodyAdvice() { + GrI18nResponseBodyAdvice i18nResponseBodyAdvice = new GrI18nResponseBodyAdvice(); + CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList<>(); + copyOnWriteArrayList.add(i18nResponseBodyAdvice); + i18nResponseBodyAdvice.setPredicates(copyOnWriteArrayList); + i18nResponseBodyAdvice.setResponseBodyAdviceProcessor(i18nResponseBodyAdvice); + return i18nResponseBodyAdvice; } /** @@ -148,6 +179,40 @@ public MessageSource messageSource() { return messageSource; } + /** + * 响应工厂 + */ + @Bean + @ConditionalOnMissingBean + public ResponseFactory responseBeanFactory() { + return new DefaultResponseFactory(); + } + + /** + * 响应状态工厂 + */ + @Bean + @ConditionalOnMissingBean + public ResponseStatusFactory responseStatusFactory() { + return new DefaultResponseStatusFactoryImpl(); + } + + /** + * 异常别名注册 + */ + @Bean + public ExceptionAliasRegister exceptionAliasRegister() { + return new ExceptionAliasRegister(); + } + + /** + * 响应支持 + */ + @Bean + public AdviceSupport adviceSupport() { + return new AdviceSupport(); + } + /** * SpringDoc 全局响应处理器 * diff --git a/continew-starter-web/src/main/resources/default-web.yml b/continew-starter-web/src/main/resources/default-web.yml index 111325c..611d933 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)