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)