From 8de3080da8340f5f683dae1688e37390500d767f Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 14 Jun 2024 09:57:42 +0800 Subject: [PATCH 01/19] =?UTF-8?q?feat(REQ-2516):=20=E6=B7=BB=E5=8A=A0=20Co?= =?UTF-8?q?nsumer=20=E7=9A=84=20Setter=20=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/axzo/framework/rocketmq/EventConsumer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventConsumer.java b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventConsumer.java index e782d67..68468d5 100644 --- a/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventConsumer.java +++ b/axzo-common-rocketmq/src/main/java/cn/axzo/framework/rocketmq/EventConsumer.java @@ -80,10 +80,12 @@ public interface EventConsumer { /** * 只elapse 超过多少毫秒才进行日志记录。默认 3ms */ + @Setter private Long logElapsedThreshold; private Map headers; private Map ext; + @Setter private Long maxAllowElapsedMillis; private Boolean logEnabled; private transient Predicate logFilter; From d61c04e1235e40eeb9d409f6f4538aafb45c01e6 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 24 Jun 2024 19:56:11 +0800 Subject: [PATCH 02/19] =?UTF-8?q?feat(REQ-2516):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BE=AE=E6=9C=8D=E5=8A=A1=E9=97=B4=E8=B0=83=E7=94=A8=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BF=A1=E6=81=AF=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- axzo-common-autoconfigure/pom.xml | 8 +- .../ExceptionHandlerAutoConfiguration.java | 17 +++ axzo-common-web/pom.xml | 15 +- .../BasicRecordExceptionHandler.java | 132 ++++++++++++++++++ .../FeignRecordExceptionInterceptor.java | 55 ++++++++ 5 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java create mode 100644 axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java diff --git a/axzo-common-autoconfigure/pom.xml b/axzo-common-autoconfigure/pom.xml index 20704d6..147da50 100644 --- a/axzo-common-autoconfigure/pom.xml +++ b/axzo-common-autoconfigure/pom.xml @@ -94,5 +94,11 @@ org.springframework.security spring-security-web + + io.github.openfeign + feign-core + compile + true + - \ No newline at end of file + diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java index fed8d6e..f9b8629 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java @@ -8,6 +8,9 @@ import cn.axzo.framework.autoconfigure.web.exception.resolver.internal.RequestRe import cn.axzo.framework.autoconfigure.web.exception.support.GlobalErrorController; import cn.axzo.framework.autoconfigure.web.exception.support.GlobalExceptionHandler; import cn.axzo.framework.domain.web.result.Result; +import cn.axzo.framework.web.exception.BasicRecordExceptionHandler; +import cn.axzo.framework.web.feign.FeignRecordExceptionInterceptor; +import feign.RequestInterceptor; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -184,4 +187,18 @@ public class ExceptionHandlerAutoConfiguration implements WebMvcConfigurer { return new RequestRejectedExceptionHttpStatusResolver(); } } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass(RequestInterceptor.class) + public static class RecordExceptionConfiguration { + @Bean + public RequestInterceptor requestInterceptor(){ + return new FeignRecordExceptionInterceptor(); + } + + @Bean + public BasicRecordExceptionHandler basicRecordExceptionHandler() { + return new BasicRecordExceptionHandler(); + } + } } diff --git a/axzo-common-web/pom.xml b/axzo-common-web/pom.xml index 6176422..c310905 100644 --- a/axzo-common-web/pom.xml +++ b/axzo-common-web/pom.xml @@ -43,5 +43,18 @@ com.baomidou mybatis-plus-core + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + io.github.openfeign + feign-core + compile + true + - \ No newline at end of file + diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java new file mode 100644 index 0000000..f8618de --- /dev/null +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java @@ -0,0 +1,132 @@ +package cn.axzo.framework.web.exception; + +import cn.axzo.framework.domain.web.result.ApiResult; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.Getter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.PriorityOrdered; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 最高优先级的异常处理器,主要是记录应用的异常,并抛出 + * + * @author wangli + * @since 2024/6/24 09:43 + */ +@RestControllerAdvice +@ResponseBody +public final class BasicRecordExceptionHandler implements PriorityOrdered { + private static final Logger log = LoggerFactory.getLogger(BasicRecordExceptionHandler.class); + public static final String CTX_LOG_ID = "ctxLogId"; + /** + * 多设置一个key = TraceId, value为traceId的变量到MDC. 以兼容目前的logback-spring.xml的配置 + */ + public static final String TRACE_ID_IN_MDC = "traceId"; + public static final String MICRO_SERVER_RECORD_ERROR_HEADER_NAME = "X-Metadata-Tag"; + public static final String MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME = "pkg"; + public static final String MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE = "cn.axzo"; + + + @Value("${axzo.framework.debugging:X-Metadata-Tag}") + private String recordExceptionHeaderName; + @Value("${spring.application.name:}") + private String applicationName; + + @Override + public int getOrder() { + return Integer.MIN_VALUE; + } + + @ExceptionHandler(value = Throwable.class) + public ApiResult globalException(HttpServletRequest request, HttpServletResponse response, Throwable e) throws Throwable { + String headerValue; + if (StringUtils.hasText(recordExceptionHeaderName) && Objects.nonNull(headerValue = request.getHeader(recordExceptionHeaderName))) { + log.debug("recordException HeaderName: {}", headerValue); + if (Boolean.parseBoolean(headerValue)) { + ApiResult error = ApiResult.err(500, "discovery server internal error"); + Map recordExceptionMap = new HashMap<>(); + recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", e); + error.setData(rebuildThrowable(e, request)); + return error; + } + throw e; + } + // 重新抛出 + throw e; + } + + private ExceptionWrapper rebuildThrowable(Throwable throwable, HttpServletRequest request) { + return new ExceptionWrapper(throwable, request); + } + + @Getter + static class ExceptionWrapper implements Serializable { + private final String traceId = getOutsideTraceId(); + private final String causeMessage; + private final List stackTrace = new ArrayList<>(); + + public ExceptionWrapper(Throwable throwable, HttpServletRequest request) { + this.causeMessage = throwable.getMessage(); + init(throwable, request); + } + + private void init(Throwable throwable, HttpServletRequest request) { + List elements = Arrays.stream(throwable.getStackTrace()).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(elements)) { + return; + } + List filterPackageNames = Arrays.asList(request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME)); + filterPackageNames = CollectionUtils.isEmpty(filterPackageNames) ? Lists.newArrayList(MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE) : filterPackageNames; + for (StackTraceElement e : elements) { + if (StringUtils.hasText(e.getClassName())) { + filterPackageNames.stream().filter(i -> e.getClassName().contains(i)).findAny().ifPresent(t -> { + StackTraceWrapper wrapper = new StackTraceWrapper(); + wrapper.setClassName(e.getClassName()); + wrapper.setMethodName(e.getMethodName()); + wrapper.setLineNumber(e.getLineNumber()); + stackTrace.add(wrapper.toString()); + }); + } + } + } + } + + @Data + static class StackTraceWrapper implements Serializable { + private String className; + private String methodName; + private Integer lineNumber; + + @Override + public String toString() { + return className + "#" + methodName + ":" + lineNumber; + } + } + + private static String getOutsideTraceId() { + String res = MDC.get(TRACE_ID_IN_MDC); + if (Objects.isNull(res)) { + res = MDC.get(CTX_LOG_ID); + } + return res; + } +} diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java new file mode 100644 index 0000000..35c9e88 --- /dev/null +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java @@ -0,0 +1,55 @@ +package cn.axzo.framework.web.feign; + +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; +import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_HEADER_NAME; + +/** + * 用于 Feign 调用时,传递外部 HTTP 请求中携带的特殊 Header + * + * @author wangli + * @since 2024/6/24 19:29 + */ +public class FeignRecordExceptionInterceptor implements RequestInterceptor { + private static final Logger log = LoggerFactory.getLogger(FeignRecordExceptionInterceptor.class); + @Override + public void apply(RequestTemplate template) { + HttpServletRequest originalRequest = getOriginalRequest(); + if (Objects.isNull(originalRequest)) { + return; + } + + setRequestParams(template, originalRequest); + + setXMetaDataTag(template, originalRequest); + } + + private void setRequestParams(RequestTemplate template, HttpServletRequest originalRequest) { + String[] packageNames = originalRequest.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + template.query(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME, packageNames); + } + + private static void setXMetaDataTag(RequestTemplate template, HttpServletRequest originalRequest) { + // 需要传递外部传入的标识 + template.header(MICRO_SERVER_RECORD_ERROR_HEADER_NAME, originalRequest.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME)); + } + + public HttpServletRequest getOriginalRequest() { + try { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + return attributes.getRequest(); + } catch (Exception e) { + log.warn("not HttpServletRequest instance bean found"); + return null; + } + } +} From ddf1bbcd9d11814421f6636ba81a00337cdb6580 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 24 Jun 2024 20:10:36 +0800 Subject: [PATCH 03/19] =?UTF-8?q?feat(REQ-2516):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BE=AE=E6=9C=8D=E5=8A=A1=E9=97=B4=E8=B0=83=E7=94=A8=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E4=BF=A1=E6=81=AF=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/BasicRecordExceptionHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java index f8618de..cecb3f3 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java @@ -94,8 +94,11 @@ public final class BasicRecordExceptionHandler implements PriorityOrdered { if (CollectionUtils.isEmpty(elements)) { return; } - List filterPackageNames = Arrays.asList(request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME)); - filterPackageNames = CollectionUtils.isEmpty(filterPackageNames) ? Lists.newArrayList(MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE) : filterPackageNames; + String[] parameterValues = request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + List filterPackageNames = Lists.newArrayList(MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE); + if(Objects.nonNull(parameterValues) && parameterValues.length > 0) { + filterPackageNames = Arrays.asList(parameterValues); + } for (StackTraceElement e : elements) { if (StringUtils.hasText(e.getClassName())) { filterPackageNames.stream().filter(i -> e.getClassName().contains(i)).findAny().ifPresent(t -> { From a3d86462490f3cf16bd39caa2318541bd3dddc13 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Jun 2024 09:56:51 +0800 Subject: [PATCH 04/19] =?UTF-8?q?feat(REQ-2516):=20=E9=80=9A=E8=BF=87=20MD?= =?UTF-8?q?C=20=E5=85=BC=E5=AE=B9=E5=BA=94=E7=94=A8=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BA=86=E5=BC=82=E6=AD=A5=EF=BC=88=E5=A6=82=20Completable?= =?UTF-8?q?=EF=BC=89=E5=AF=BC=E8=87=B4=E7=9A=84=E6=97=A0=E6=B3=95=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E4=BC=A0=E9=80=92=20header=20=E4=BB=A5=E5=8F=8A=20pkg?= =?UTF-8?q?=20=E5=8F=82=E6=95=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExceptionHandlerAutoConfiguration.java | 9 ++++ .../BasicRecordExceptionHandler.java | 26 ++++++------ .../FeignRecordExceptionInterceptor.java | 2 +- .../filter/BasicRecordExceptionFilter.java | 42 +++++++++++++++++++ 4 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java index f9b8629..67c2290 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java @@ -10,7 +10,9 @@ import cn.axzo.framework.autoconfigure.web.exception.support.GlobalExceptionHand import cn.axzo.framework.domain.web.result.Result; import cn.axzo.framework.web.exception.BasicRecordExceptionHandler; import cn.axzo.framework.web.feign.FeignRecordExceptionInterceptor; +import cn.axzo.framework.web.filter.BasicRecordExceptionFilter; import feign.RequestInterceptor; +import org.slf4j.MDC; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -25,6 +27,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; import org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator; import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator; +import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @@ -200,5 +203,11 @@ public class ExceptionHandlerAutoConfiguration implements WebMvcConfigurer { public BasicRecordExceptionHandler basicRecordExceptionHandler() { return new BasicRecordExceptionHandler(); } + + @Bean + @ConditionalOnClass(MDC.class) + public OncePerRequestFilter oncePerRequestFilter() { + return new BasicRecordExceptionFilter(); + } } } diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java index cecb3f3..ab61b7e 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java @@ -58,17 +58,17 @@ public final class BasicRecordExceptionHandler implements PriorityOrdered { @ExceptionHandler(value = Throwable.class) public ApiResult globalException(HttpServletRequest request, HttpServletResponse response, Throwable e) throws Throwable { - String headerValue; - if (StringUtils.hasText(recordExceptionHeaderName) && Objects.nonNull(headerValue = request.getHeader(recordExceptionHeaderName))) { - log.debug("recordException HeaderName: {}", headerValue); - if (Boolean.parseBoolean(headerValue)) { - ApiResult error = ApiResult.err(500, "discovery server internal error"); - Map recordExceptionMap = new HashMap<>(); - recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", e); - error.setData(rebuildThrowable(e, request)); - return error; - } - throw e; + String headerValue = request.getHeader(recordExceptionHeaderName); + if (!StringUtils.hasText(headerValue)) { + headerValue = MDC.get(recordExceptionHeaderName); + } + log.debug("recordException HeaderName: {}", headerValue); + if (Boolean.parseBoolean(headerValue)) { + ApiResult error = ApiResult.err(500, "discovery server internal error"); + Map recordExceptionMap = new HashMap<>(); + recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", e); + error.setData(rebuildThrowable(e, request)); + return error; } // 重新抛出 throw e; @@ -96,8 +96,10 @@ public final class BasicRecordExceptionHandler implements PriorityOrdered { } String[] parameterValues = request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); List filterPackageNames = Lists.newArrayList(MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE); - if(Objects.nonNull(parameterValues) && parameterValues.length > 0) { + if (Objects.nonNull(parameterValues) && parameterValues.length > 0) { filterPackageNames = Arrays.asList(parameterValues); + } else if (StringUtils.hasText(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME))) { + filterPackageNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME))); } for (StackTraceElement e : elements) { if (StringUtils.hasText(e.getClassName())) { diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java index 35c9e88..9e61580 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java @@ -43,7 +43,7 @@ public class FeignRecordExceptionInterceptor implements RequestInterceptor { template.header(MICRO_SERVER_RECORD_ERROR_HEADER_NAME, originalRequest.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME)); } - public HttpServletRequest getOriginalRequest() { + public static HttpServletRequest getOriginalRequest() { try { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); return attributes.getRequest(); diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java new file mode 100644 index 0000000..28616ba --- /dev/null +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java @@ -0,0 +1,42 @@ +package cn.axzo.framework.web.filter; + +import cn.axzo.framework.validator.constraints.UTF8; +import com.google.common.collect.Lists; +import jdk.nashorn.internal.runtime.JSONFunctions; +import org.slf4j.MDC; +import org.springframework.core.Ordered; +import org.springframework.core.PriorityOrdered; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; + +import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; +import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_HEADER_NAME; + +/** + * TODO + * + * @author wangli + * @since 2024/6/25 09:40 + */ +public class BasicRecordExceptionFilter extends OncePerRequestFilter implements PriorityOrdered { + @Override + public int getOrder() { + return Ordered.HIGHEST_PRECEDENCE; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + String[] packageNames = request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + MDC.put(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME, StringUtils.arrayToCommaDelimitedString(packageNames)); + + // 需要传递外部传入的标识 + MDC.put(MICRO_SERVER_RECORD_ERROR_HEADER_NAME, request.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME)); + } +} From 4e9904739899b508812914d29d17381a5648ed00 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Jun 2024 12:41:15 +0800 Subject: [PATCH 05/19] =?UTF-8?q?feat(REQ-2516):=20=E6=96=B0=E5=A2=9E=20Ex?= =?UTF-8?q?ceptionResultHandler=20=E5=8F=AF=E8=87=AA=E4=B8=BB=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=98=AF=E5=90=A6=E8=B7=B3=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/exception/support/GlobalExceptionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index b5739d8..b247c43 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -281,7 +281,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { if (handler.isRecursive()) { - return handler.getExceptionClass().isAssignableFrom(e.getClass()); + return handler.shouldFilter(handler, e); } return handler.getExceptionClass() == e.getClass(); } From b05ba57a7dedb8c21c09f07bca66e83ab3892192 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Jun 2024 12:41:35 +0800 Subject: [PATCH 06/19] =?UTF-8?q?feat(REQ-2516):=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=BC=82=E5=B8=B8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/handler/ExceptionResultHandler.java | 4 ++++ .../feign/FeignRecordExceptionInterceptor.java | 12 +++++++++++- .../filter/BasicRecordExceptionFilter.java | 4 ---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java index f075cd9..2ea6554 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java @@ -27,4 +27,8 @@ public interface ExceptionResultHandler { default boolean isRecursive() { return false; } + + default boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { + return handler.getExceptionClass().isAssignableFrom(e.getClass()); + } } diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java index 9e61580..18487e8 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java @@ -4,6 +4,8 @@ import feign.RequestInterceptor; import feign.RequestTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -21,6 +23,7 @@ import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_ */ public class FeignRecordExceptionInterceptor implements RequestInterceptor { private static final Logger log = LoggerFactory.getLogger(FeignRecordExceptionInterceptor.class); + @Override public void apply(RequestTemplate template) { HttpServletRequest originalRequest = getOriginalRequest(); @@ -35,12 +38,19 @@ public class FeignRecordExceptionInterceptor implements RequestInterceptor { private void setRequestParams(RequestTemplate template, HttpServletRequest originalRequest) { String[] packageNames = originalRequest.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + if (Objects.isNull(packageNames) || packageNames.length == 0) { + packageNames = StringUtils.commaDelimitedListToStringArray(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME)); + } template.query(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME, packageNames); } private static void setXMetaDataTag(RequestTemplate template, HttpServletRequest originalRequest) { // 需要传递外部传入的标识 - template.header(MICRO_SERVER_RECORD_ERROR_HEADER_NAME, originalRequest.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME)); + String headerValue = originalRequest.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME); + if (!StringUtils.hasText(headerValue)) { + headerValue = MDC.get(MICRO_SERVER_RECORD_ERROR_HEADER_NAME); + } + template.header(MICRO_SERVER_RECORD_ERROR_HEADER_NAME, headerValue); } public static HttpServletRequest getOriginalRequest() { diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java index 28616ba..c980f8a 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java @@ -1,8 +1,5 @@ package cn.axzo.framework.web.filter; -import cn.axzo.framework.validator.constraints.UTF8; -import com.google.common.collect.Lists; -import jdk.nashorn.internal.runtime.JSONFunctions; import org.slf4j.MDC; import org.springframework.core.Ordered; import org.springframework.core.PriorityOrdered; @@ -14,7 +11,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.util.Arrays; import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_HEADER_NAME; From 2f537e0001434d28d3a6452b330a61d161e3b9bd Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Jun 2024 13:59:11 +0800 Subject: [PATCH 07/19] =?UTF-8?q?feat(REQ-2516):=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=BC=82=E5=B8=B8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/exception/handler/ExceptionResultHandler.java | 4 ---- .../web/exception/support/GlobalExceptionHandler.java | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java index 2ea6554..f075cd9 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/handler/ExceptionResultHandler.java @@ -27,8 +27,4 @@ public interface ExceptionResultHandler { default boolean isRecursive() { return false; } - - default boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { - return handler.getExceptionClass().isAssignableFrom(e.getClass()); - } } diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index b247c43..b5739d8 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -281,7 +281,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { if (handler.isRecursive()) { - return handler.shouldFilter(handler, e); + return handler.getExceptionClass().isAssignableFrom(e.getClass()); } return handler.getExceptionClass() == e.getClass(); } From f42e5e5b0fb38e7791ebbbef2be9ea3df88eb091 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Jun 2024 15:16:01 +0800 Subject: [PATCH 08/19] =?UTF-8?q?feat(REQ-2516):=20=E5=A4=84=E7=90=86=20Fi?= =?UTF-8?q?lter=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/BasicRecordExceptionFilter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java index c980f8a..8529a05 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java @@ -34,5 +34,7 @@ public class BasicRecordExceptionFilter extends OncePerRequestFilter implements // 需要传递外部传入的标识 MDC.put(MICRO_SERVER_RECORD_ERROR_HEADER_NAME, request.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME)); + + filterChain.doFilter(request, response); } } From b48e60e33709da398db5b1d25c84121a4e26b61c Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 25 Jun 2024 18:54:36 +0800 Subject: [PATCH 09/19] =?UTF-8?q?feat(REQ-2516):=20=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E6=8F=90=E4=BA=A4,=E6=9C=AA=E6=B5=8B=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExceptionHandlerAutoConfiguration.java | 6 - .../support/GlobalExceptionHandler.java | 128 +++++++++++++++- .../BasicRecordExceptionHandler.java | 137 ------------------ .../FeignRecordExceptionInterceptor.java | 20 ++- .../filter/BasicRecordExceptionFilter.java | 5 +- 5 files changed, 137 insertions(+), 159 deletions(-) delete mode 100644 axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java index 67c2290..7627737 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/ExceptionHandlerAutoConfiguration.java @@ -8,7 +8,6 @@ import cn.axzo.framework.autoconfigure.web.exception.resolver.internal.RequestRe import cn.axzo.framework.autoconfigure.web.exception.support.GlobalErrorController; import cn.axzo.framework.autoconfigure.web.exception.support.GlobalExceptionHandler; import cn.axzo.framework.domain.web.result.Result; -import cn.axzo.framework.web.exception.BasicRecordExceptionHandler; import cn.axzo.framework.web.feign.FeignRecordExceptionInterceptor; import cn.axzo.framework.web.filter.BasicRecordExceptionFilter; import feign.RequestInterceptor; @@ -199,11 +198,6 @@ public class ExceptionHandlerAutoConfiguration implements WebMvcConfigurer { return new FeignRecordExceptionInterceptor(); } - @Bean - public BasicRecordExceptionHandler basicRecordExceptionHandler() { - return new BasicRecordExceptionHandler(); - } - @Bean @ConditionalOnClass(MDC.class) public OncePerRequestFilter oncePerRequestFilter() { diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index b5739d8..3deba1a 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -10,7 +10,14 @@ import cn.axzo.framework.domain.web.result.Result; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.Getter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; import org.springframework.beans.TypeMismatchException; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.web.ErrorProperties; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.web.servlet.error.ErrorAttributes; @@ -19,6 +26,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -34,12 +43,22 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; +import static cn.axzo.framework.domain.web.result.ApiResult.err; +import static cn.axzo.framework.web.filter.BasicRecordExceptionFilter.MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE; +import static cn.axzo.framework.web.filter.BasicRecordExceptionFilter.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; import static java.lang.String.format; import static jodd.util.StringUtil.isNotBlank; +import static org.springframework.http.HttpHeaders.CACHE_CONTROL; /** * @Description spring mvc全局异常捕获 @@ -48,6 +67,7 @@ import static jodd.util.StringUtil.isNotBlank; **/ @RestControllerAdvice(annotations = {Controller.class, RestController.class}) public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); private final List> handlers; @@ -55,6 +75,18 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private final ErrorAttributes errorAttributes; + public static final String CTX_LOG_ID = "ctxLogId"; + /** + * 多设置一个key = TraceId, value为traceId的变量到MDC. 以兼容目前的logback-spring.xml的配置 + */ + public static final String TRACE_ID_IN_MDC = "traceId"; + + + @Value("${axzo.framework.debugging:X-Metadata-Tag}") + private String recordExceptionHeaderName; + @Value("${spring.application.name:}") + private String applicationName; + public GlobalExceptionHandler(List> handlers, ErrorAttributes errorAttributes, ServerProperties properties) { @@ -85,7 +117,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { } // 3.响应 - return ApiResult.err(Integer.parseInt(code), message); + return err(Integer.parseInt(code), message); }); return super.handleExceptionInternal(ex, result, headers, status, request); @@ -111,7 +143,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { } // 3.响应 - return ApiResult.err(Integer.parseInt(code), message); + return err(Integer.parseInt(code), message); }); return super.handleExceptionInternal(ex, result, headers, status, request); } @@ -136,7 +168,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { } // 3.响应 - return ApiResult.err(Integer.parseInt(code), message); + return err(Integer.parseInt(code), message); }); return super.handleExceptionInternal(ex, result, headers, status, request); } @@ -162,7 +194,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { } // 3.响应 - return ApiResult.err(Integer.parseInt(code), message); + return err(Integer.parseInt(code), message); }); return super.handleExceptionInternal(ex, result, headers, status, request); } @@ -185,7 +217,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { message = "Required parameter '" + field + "' is not present"; // 3.响应 - return ApiResult.err(Integer.parseInt(code), message); + return err(Integer.parseInt(code), message); }); return super.handleExceptionInternal(ex, result, headers, status, request); } @@ -230,7 +262,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { } // 3.响应 - return ApiResult.err(Integer.parseInt(code), message); + return err(Integer.parseInt(code), message); }); return super.handleExceptionInternal(ex, result, headers, status, request); } @@ -242,6 +274,9 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { @ExceptionHandler(Throwable.class) public Result handleAllException(HttpServletRequest request, HttpServletResponse response, Throwable e) { + if (shouldRecordException(request)) { + return buildResult(request, response, e); + } Map attributes = Requests.from(request).getErrorAttributes(errorAttributes, errorProperties); return _handleException(request, response, e, attributes) .orElseGet(() -> handlers.stream() @@ -252,6 +287,16 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { ); } + private Result buildResult(HttpServletRequest request, HttpServletResponse response, Throwable e) { + response.setHeader(CACHE_CONTROL, "no-store"); + response.setStatus(251); + ApiResult err = err(251, "discovery server internal error"); + Map recordExceptionMap = new HashMap<>(); + recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", rebuildThrowable(e, request)); + err.setData(recordExceptionMap); + return err; + } + private Optional _handleException(WebRequest webRequest, Throwable e) { Map attributes = Requests.from(webRequest).getErrorAttributes(errorAttributes, errorProperties); if (webRequest instanceof ServletWebRequest) { @@ -279,10 +324,81 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { } } + private boolean shouldRecordException(HttpServletRequest request) { + String headerValue = request.getHeader(recordExceptionHeaderName); + if (!StringUtils.hasText(headerValue)) { + headerValue = MDC.get(recordExceptionHeaderName); + } + log.info("recordException HeaderName: {}", headerValue); + return Boolean.parseBoolean(headerValue); + } + private boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { if (handler.isRecursive()) { return handler.getExceptionClass().isAssignableFrom(e.getClass()); } return handler.getExceptionClass() == e.getClass(); } + + private ExceptionWrapper rebuildThrowable(Throwable throwable, HttpServletRequest request) { + return new ExceptionWrapper(throwable, request); + } + + @Getter + static class ExceptionWrapper implements Serializable { + private final String traceId = getOutsideTraceId(); + private final String causeMessage; + private final List stackTrace = new ArrayList<>(); + + public ExceptionWrapper(Throwable throwable, HttpServletRequest request) { + this.causeMessage = throwable.getMessage(); + init(throwable, request); + } + + private void init(Throwable throwable, HttpServletRequest request) { + List elements = Arrays.stream(throwable.getStackTrace()).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(elements)) { + return; + } + String[] parameterValues = request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + List filterPackageNames = Lists.newArrayList(MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE); + if (Objects.nonNull(parameterValues) && parameterValues.length > 0) { + filterPackageNames = Arrays.asList(parameterValues); + } else if (StringUtils.hasText(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME))) { + filterPackageNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME))); + } + for (StackTraceElement e : elements) { + if (StringUtils.hasText(e.getClassName())) { + filterPackageNames.stream().filter(i -> e.getClassName().contains(i)).findAny().ifPresent(t -> { + StackTraceWrapper wrapper = new StackTraceWrapper(); + wrapper.setClassName(e.getClassName()); + wrapper.setMethodName(e.getMethodName()); + wrapper.setLineNumber(e.getLineNumber()); + stackTrace.add(wrapper.toString()); + }); + } + } + } + } + + @Data + static class StackTraceWrapper implements Serializable { + private String className; + private String methodName; + private Integer lineNumber; + + @Override + public String toString() { + return className + "#" + methodName + ":" + lineNumber; + } + } + + + private static String getOutsideTraceId() { + String res = MDC.get(TRACE_ID_IN_MDC); + if (Objects.isNull(res)) { + res = MDC.get(CTX_LOG_ID); + } + return res; + } } diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java deleted file mode 100644 index ab61b7e..0000000 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/exception/BasicRecordExceptionHandler.java +++ /dev/null @@ -1,137 +0,0 @@ -package cn.axzo.framework.web.exception; - -import cn.axzo.framework.domain.web.result.ApiResult; -import com.google.common.collect.Lists; -import lombok.Data; -import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.PriorityOrdered; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * 最高优先级的异常处理器,主要是记录应用的异常,并抛出 - * - * @author wangli - * @since 2024/6/24 09:43 - */ -@RestControllerAdvice -@ResponseBody -public final class BasicRecordExceptionHandler implements PriorityOrdered { - private static final Logger log = LoggerFactory.getLogger(BasicRecordExceptionHandler.class); - public static final String CTX_LOG_ID = "ctxLogId"; - /** - * 多设置一个key = TraceId, value为traceId的变量到MDC. 以兼容目前的logback-spring.xml的配置 - */ - public static final String TRACE_ID_IN_MDC = "traceId"; - public static final String MICRO_SERVER_RECORD_ERROR_HEADER_NAME = "X-Metadata-Tag"; - public static final String MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME = "pkg"; - public static final String MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE = "cn.axzo"; - - - @Value("${axzo.framework.debugging:X-Metadata-Tag}") - private String recordExceptionHeaderName; - @Value("${spring.application.name:}") - private String applicationName; - - @Override - public int getOrder() { - return Integer.MIN_VALUE; - } - - @ExceptionHandler(value = Throwable.class) - public ApiResult globalException(HttpServletRequest request, HttpServletResponse response, Throwable e) throws Throwable { - String headerValue = request.getHeader(recordExceptionHeaderName); - if (!StringUtils.hasText(headerValue)) { - headerValue = MDC.get(recordExceptionHeaderName); - } - log.debug("recordException HeaderName: {}", headerValue); - if (Boolean.parseBoolean(headerValue)) { - ApiResult error = ApiResult.err(500, "discovery server internal error"); - Map recordExceptionMap = new HashMap<>(); - recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", e); - error.setData(rebuildThrowable(e, request)); - return error; - } - // 重新抛出 - throw e; - } - - private ExceptionWrapper rebuildThrowable(Throwable throwable, HttpServletRequest request) { - return new ExceptionWrapper(throwable, request); - } - - @Getter - static class ExceptionWrapper implements Serializable { - private final String traceId = getOutsideTraceId(); - private final String causeMessage; - private final List stackTrace = new ArrayList<>(); - - public ExceptionWrapper(Throwable throwable, HttpServletRequest request) { - this.causeMessage = throwable.getMessage(); - init(throwable, request); - } - - private void init(Throwable throwable, HttpServletRequest request) { - List elements = Arrays.stream(throwable.getStackTrace()).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(elements)) { - return; - } - String[] parameterValues = request.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); - List filterPackageNames = Lists.newArrayList(MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE); - if (Objects.nonNull(parameterValues) && parameterValues.length > 0) { - filterPackageNames = Arrays.asList(parameterValues); - } else if (StringUtils.hasText(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME))) { - filterPackageNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME))); - } - for (StackTraceElement e : elements) { - if (StringUtils.hasText(e.getClassName())) { - filterPackageNames.stream().filter(i -> e.getClassName().contains(i)).findAny().ifPresent(t -> { - StackTraceWrapper wrapper = new StackTraceWrapper(); - wrapper.setClassName(e.getClassName()); - wrapper.setMethodName(e.getMethodName()); - wrapper.setLineNumber(e.getLineNumber()); - stackTrace.add(wrapper.toString()); - }); - } - } - } - } - - @Data - static class StackTraceWrapper implements Serializable { - private String className; - private String methodName; - private Integer lineNumber; - - @Override - public String toString() { - return className + "#" + methodName + ":" + lineNumber; - } - } - - private static String getOutsideTraceId() { - String res = MDC.get(TRACE_ID_IN_MDC); - if (Objects.isNull(res)) { - res = MDC.get(CTX_LOG_ID); - } - return res; - } -} diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java index 18487e8..4a9ca6d 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java @@ -12,8 +12,9 @@ import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Objects; -import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; -import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_HEADER_NAME; +import static cn.axzo.framework.web.filter.BasicRecordExceptionFilter.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; +import static cn.axzo.framework.web.filter.BasicRecordExceptionFilter.MICRO_SERVER_RECORD_ERROR_HEADER_NAME; + /** * 用于 Feign 调用时,传递外部 HTTP 请求中携带的特殊 Header @@ -27,9 +28,6 @@ public class FeignRecordExceptionInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { HttpServletRequest originalRequest = getOriginalRequest(); - if (Objects.isNull(originalRequest)) { - return; - } setRequestParams(template, originalRequest); @@ -37,7 +35,10 @@ public class FeignRecordExceptionInterceptor implements RequestInterceptor { } private void setRequestParams(RequestTemplate template, HttpServletRequest originalRequest) { - String[] packageNames = originalRequest.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + String[] packageNames = null; + if(Objects.nonNull(originalRequest)) { + packageNames = originalRequest.getParameterValues(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME); + } if (Objects.isNull(packageNames) || packageNames.length == 0) { packageNames = StringUtils.commaDelimitedListToStringArray(MDC.get(MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME)); } @@ -45,8 +46,11 @@ public class FeignRecordExceptionInterceptor implements RequestInterceptor { } private static void setXMetaDataTag(RequestTemplate template, HttpServletRequest originalRequest) { - // 需要传递外部传入的标识 - String headerValue = originalRequest.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME); + String headerValue = null; + if(Objects.nonNull(originalRequest)) { + // 需要传递外部传入的标识 + headerValue = originalRequest.getHeader(MICRO_SERVER_RECORD_ERROR_HEADER_NAME); + } if (!StringUtils.hasText(headerValue)) { headerValue = MDC.get(MICRO_SERVER_RECORD_ERROR_HEADER_NAME); } diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java index 8529a05..0f18ee2 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java @@ -12,8 +12,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; -import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_SERVER_RECORD_ERROR_HEADER_NAME; /** * TODO @@ -22,6 +20,9 @@ import static cn.axzo.framework.web.exception.BasicRecordExceptionHandler.MICRO_ * @since 2024/6/25 09:40 */ public class BasicRecordExceptionFilter extends OncePerRequestFilter implements PriorityOrdered { + public static final String MICRO_SERVER_RECORD_ERROR_HEADER_NAME = "X-Metadata-Tag"; + public static final String MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME = "pkg"; + public static final String MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE = "cn.axzo"; @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; From 52401ef2f4d1f6ebd0abc0f52e1342362b746125 Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 25 Jun 2024 22:03:20 +0800 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E9=80=9A?= =?UTF-8?q?=E8=BF=87=20X-Metadata-Tag=20=E8=BF=9B=E8=A1=8C=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FeignErrorDecoderAutoConfiguration.java | 46 +++++++++++++++++++ .../support/GlobalExceptionHandler.java | 12 ++++- .../axzo/framework/core/RecordException.java | 22 +++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/feign/FeignErrorDecoderAutoConfiguration.java create mode 100644 axzo-common-core/src/main/java/cn/axzo/framework/core/RecordException.java diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/feign/FeignErrorDecoderAutoConfiguration.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/feign/FeignErrorDecoderAutoConfiguration.java new file mode 100644 index 0000000..a2b46a7 --- /dev/null +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/feign/FeignErrorDecoderAutoConfiguration.java @@ -0,0 +1,46 @@ +package cn.axzo.framework.autoconfigure.feign; + +import cn.axzo.framework.core.RecordException; +import feign.Feign; +import feign.Response; +import feign.Util; +import feign.codec.ErrorDecoder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.DispatcherServlet; + +import javax.servlet.Servlet; +import java.io.IOException; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * 为兼容 X-Metadata-Tag 的异常解码器 + * + * @author wangli + * @since 2024/6/25 21:55 + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnWebApplication +@ConditionalOnClass({Feign.class, Servlet.class, DispatcherServlet.class}) +public class FeignErrorDecoderAutoConfiguration { + + @Bean + public ErrorDecoder feignErrorDecoder() { + return (methodKey, response) -> { + if (response.status() != 512) { + return new ErrorDecoder.Default().decode(methodKey, response); + } + byte[] body = {}; + try { + if (response.body() != null) { + body = Util.toByteArray(response.body().asInputStream()); + } + } catch (IOException ignored) { // NOPMD + } + return new RecordException(new String(body, UTF_8)); + }; + } +} diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index 3deba1a..1c97d25 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -3,12 +3,15 @@ package cn.axzo.framework.autoconfigure.web.exception.support; import cn.axzo.framework.autoconfigure.web.exception.handler.ExceptionResultHandler; import cn.axzo.framework.autoconfigure.web.exception.handler.internal.StandardExceptionResultHandler; import cn.axzo.framework.core.InternalException; +import cn.axzo.framework.core.RecordException; import cn.axzo.framework.core.util.ClassUtil; import cn.axzo.framework.domain.web.code.BaseCode; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.Result; import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import com.google.common.collect.Lists; import lombok.Data; @@ -272,6 +275,11 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { throw e; } + @ExceptionHandler(RecordException.class) + public String recordException(HttpServletRequest request, HttpServletResponse response, Throwable e) { + return e.getMessage(); + } + @ExceptionHandler(Throwable.class) public Result handleAllException(HttpServletRequest request, HttpServletResponse response, Throwable e) { if (shouldRecordException(request)) { @@ -289,8 +297,8 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private Result buildResult(HttpServletRequest request, HttpServletResponse response, Throwable e) { response.setHeader(CACHE_CONTROL, "no-store"); - response.setStatus(251); - ApiResult err = err(251, "discovery server internal error"); + response.setStatus(512); + ApiResult err = err(512, "discovery server internal error"); Map recordExceptionMap = new HashMap<>(); recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", rebuildThrowable(e, request)); err.setData(recordExceptionMap); diff --git a/axzo-common-core/src/main/java/cn/axzo/framework/core/RecordException.java b/axzo-common-core/src/main/java/cn/axzo/framework/core/RecordException.java new file mode 100644 index 0000000..8444684 --- /dev/null +++ b/axzo-common-core/src/main/java/cn/axzo/framework/core/RecordException.java @@ -0,0 +1,22 @@ +package cn.axzo.framework.core; + +/** + * 记录异常 + * + * @author wangli + * @since 2024/6/25 21:06 + */ +public class RecordException extends RuntimeException { + public RecordException(String message) { + super(message); + } + + public RecordException(String message, Throwable cause) { + super(message, cause); + } + + public RecordException(Throwable cause) { + super(cause); + } + +} From c5497f1f811c95a30e68ad399a919743e4643a38 Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 25 Jun 2024 22:28:27 +0800 Subject: [PATCH 11/19] =?UTF-8?q?feat:=20=E9=80=9A=E8=BF=87=20revision=20?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E7=89=88=E6=9C=AC=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- axzo-common-autoconfigure/pom.xml | 2 +- axzo-common-boot/pom.xml | 4 ++-- .../src/main/java/cn/axzo/framework/boot/PackageVersion.java | 2 +- axzo-common-cache/pom.xml | 4 ++-- axzo-common-clients/feign-starter/pom.xml | 4 ++-- axzo-common-clients/pom.xml | 4 ++-- axzo-common-clients/retrofit-starter/pom.xml | 4 ++-- axzo-common-core/pom.xml | 2 +- axzo-common-datas/axzo-data-mybatis-plus/pom.xml | 4 ++-- axzo-common-datas/pom.xml | 4 ++-- axzo-common-domain/pom.xml | 4 ++-- axzo-common-framework/axzo-common-context/pom.xml | 2 +- axzo-common-framework/pom.xml | 2 +- axzo-common-jackson/jackson-datatype-enumstd/pom.xml | 4 ++-- .../framework/jackson/datatype/enumstd/PackageVersion.java | 2 +- axzo-common-jackson/jackson-datatype-fraction/pom.xml | 4 ++-- .../framework/jackson/datatype/fraction/PackageVersion.java | 2 +- axzo-common-jackson/jackson-datatype-period/pom.xml | 4 ++-- .../framework/jackson/datatype/period/PackageVersion.java | 2 +- axzo-common-jackson/jackson-datatype-string-trim/pom.xml | 4 ++-- .../framework/jackson/datatype/string/PackageVersion.java | 2 +- axzo-common-jackson/jackson-starter/pom.xml | 4 ++-- .../main/java/cn/axzo/framework/jackson/PackageVersion.java | 2 +- axzo-common-jackson/jackson-utility/pom.xml | 4 ++-- axzo-common-jackson/pom.xml | 4 ++-- axzo-common-loggings/axzo-common-trace/pom.xml | 2 +- axzo-common-loggings/log4j2-starter/pom.xml | 4 ++-- axzo-common-loggings/logback-starter/pom.xml | 4 ++-- axzo-common-loggings/pom.xml | 4 ++-- axzo-common-math/pom.xml | 2 +- axzo-common-rocketmq/pom.xml | 4 ++-- axzo-common-validator/pom.xml | 2 +- axzo-common-web/pom.xml | 2 +- axzo-common-webmvc/pom.xml | 4 ++-- pom.xml | 5 +++-- 35 files changed, 57 insertions(+), 56 deletions(-) diff --git a/axzo-common-autoconfigure/pom.xml b/axzo-common-autoconfigure/pom.xml index 147da50..97ef0fc 100644 --- a/axzo-common-autoconfigure/pom.xml +++ b/axzo-common-autoconfigure/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-autoconfigure diff --git a/axzo-common-boot/pom.xml b/axzo-common-boot/pom.xml index e67695e..0ade890 100644 --- a/axzo-common-boot/pom.xml +++ b/axzo-common-boot/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-boot @@ -82,4 +82,4 @@ - \ No newline at end of file + diff --git a/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java b/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java index d5855e5..85a0c95 100644 --- a/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java +++ b/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java @@ -7,7 +7,7 @@ package cn.axzo.framework.boot; */ public final class PackageVersion { - public final static String VERSION = "1.0.0-SNAPSHOT"; + public final static String VERSION = "1.0.1-SNAPSHOT"; public final static String SPRING_CLOUD_VERSION = "2020.0.6"; } \ No newline at end of file diff --git a/axzo-common-cache/pom.xml b/axzo-common-cache/pom.xml index 198a364..bfdadb6 100644 --- a/axzo-common-cache/pom.xml +++ b/axzo-common-cache/pom.xml @@ -6,7 +6,7 @@ cn.axzo.framework axzo-framework-commons - 1.0.0-SNAPSHOT + ${revision} Axzo Common Cache axzo-common-cache @@ -21,4 +21,4 @@ jetcache-starter-redis - \ No newline at end of file + diff --git a/axzo-common-clients/feign-starter/pom.xml b/axzo-common-clients/feign-starter/pom.xml index 8062c81..31ebf0b 100644 --- a/axzo-common-clients/feign-starter/pom.xml +++ b/axzo-common-clients/feign-starter/pom.xml @@ -7,7 +7,7 @@ axzo-common-clients cn.axzo.framework.client - 1.0.0-SNAPSHOT + ${revision} feign-starter @@ -62,4 +62,4 @@ - \ No newline at end of file + diff --git a/axzo-common-clients/pom.xml b/axzo-common-clients/pom.xml index 4ee445d..97f80e2 100644 --- a/axzo-common-clients/pom.xml +++ b/axzo-common-clients/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} cn.axzo.framework.client @@ -19,4 +19,4 @@ retrofit-starter feign-starter - \ No newline at end of file + diff --git a/axzo-common-clients/retrofit-starter/pom.xml b/axzo-common-clients/retrofit-starter/pom.xml index c84f001..4a739de 100644 --- a/axzo-common-clients/retrofit-starter/pom.xml +++ b/axzo-common-clients/retrofit-starter/pom.xml @@ -7,7 +7,7 @@ cn.axzo.framework.client axzo-common-clients - 1.0.0-SNAPSHOT + ${revision} retrofit-starter @@ -35,4 +35,4 @@ adapter-rxjava2 - \ No newline at end of file + diff --git a/axzo-common-core/pom.xml b/axzo-common-core/pom.xml index 3956f45..10a1c5b 100644 --- a/axzo-common-core/pom.xml +++ b/axzo-common-core/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-core diff --git a/axzo-common-datas/axzo-data-mybatis-plus/pom.xml b/axzo-common-datas/axzo-data-mybatis-plus/pom.xml index 3badcb3..31b190f 100644 --- a/axzo-common-datas/axzo-data-mybatis-plus/pom.xml +++ b/axzo-common-datas/axzo-data-mybatis-plus/pom.xml @@ -7,7 +7,7 @@ axzo-common-datas cn.axzo.framework.data - 1.0.0-SNAPSHOT + ${revision} axzo-data-mybatis-plus @@ -50,4 +50,4 @@ fastjson - \ No newline at end of file + diff --git a/axzo-common-datas/pom.xml b/axzo-common-datas/pom.xml index 79cf886..8c10f54 100644 --- a/axzo-common-datas/pom.xml +++ b/axzo-common-datas/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} cn.axzo.framework.data @@ -18,4 +18,4 @@ axzo-data-mybatis-plus - \ No newline at end of file + diff --git a/axzo-common-domain/pom.xml b/axzo-common-domain/pom.xml index cdda956..2739554 100644 --- a/axzo-common-domain/pom.xml +++ b/axzo-common-domain/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-domain @@ -103,4 +103,4 @@ provided - \ No newline at end of file + diff --git a/axzo-common-framework/axzo-common-context/pom.xml b/axzo-common-framework/axzo-common-context/pom.xml index e4bb04a..c833457 100644 --- a/axzo-common-framework/axzo-common-context/pom.xml +++ b/axzo-common-framework/axzo-common-context/pom.xml @@ -7,7 +7,7 @@ axzo-common-framework cn.axzo.framework.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-context diff --git a/axzo-common-framework/pom.xml b/axzo-common-framework/pom.xml index 3193757..7882835 100644 --- a/axzo-common-framework/pom.xml +++ b/axzo-common-framework/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} cn.axzo.framework.framework diff --git a/axzo-common-jackson/jackson-datatype-enumstd/pom.xml b/axzo-common-jackson/jackson-datatype-enumstd/pom.xml index 3dba5fb..59faa66 100644 --- a/axzo-common-jackson/jackson-datatype-enumstd/pom.xml +++ b/axzo-common-jackson/jackson-datatype-enumstd/pom.xml @@ -5,7 +5,7 @@ axzo-common-jackson cn.axzo.framework.jackson - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -39,4 +39,4 @@ - \ No newline at end of file + diff --git a/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java b/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java index f624532..7fe0840 100644 --- a/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-enumstd"); + "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-enumstd"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-datatype-fraction/pom.xml b/axzo-common-jackson/jackson-datatype-fraction/pom.xml index 3503394..17eadd1 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/pom.xml +++ b/axzo-common-jackson/jackson-datatype-fraction/pom.xml @@ -5,7 +5,7 @@ axzo-common-jackson cn.axzo.framework.jackson - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -44,4 +44,4 @@ - \ No newline at end of file + diff --git a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java index 2a4eb78..7d75572 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-fraction"); + "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-fraction"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-datatype-period/pom.xml b/axzo-common-jackson/jackson-datatype-period/pom.xml index 8a69dbb..2a16e57 100644 --- a/axzo-common-jackson/jackson-datatype-period/pom.xml +++ b/axzo-common-jackson/jackson-datatype-period/pom.xml @@ -5,7 +5,7 @@ axzo-common-jackson cn.axzo.framework.jackson - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -40,4 +40,4 @@ - \ No newline at end of file + diff --git a/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java b/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java index 47c2dcf..ddd5cea 100644 --- a/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-period"); + "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-period"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-datatype-string-trim/pom.xml b/axzo-common-jackson/jackson-datatype-string-trim/pom.xml index 59cdf49..9513f9d 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/pom.xml +++ b/axzo-common-jackson/jackson-datatype-string-trim/pom.xml @@ -5,7 +5,7 @@ axzo-common-jackson cn.axzo.framework.jackson - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java index 03eeeda..553e8a7 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-string-trim"); + "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-string-trim"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-starter/pom.xml b/axzo-common-jackson/jackson-starter/pom.xml index 099fbc0..b02d841 100644 --- a/axzo-common-jackson/jackson-starter/pom.xml +++ b/axzo-common-jackson/jackson-starter/pom.xml @@ -5,7 +5,7 @@ axzo-common-jackson cn.axzo.framework.jackson - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -86,4 +86,4 @@ - \ No newline at end of file + diff --git a/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java b/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java index 0918924..b819a08 100644 --- a/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java +++ b/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-starter"); + "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-starter"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-utility/pom.xml b/axzo-common-jackson/jackson-utility/pom.xml index e74dde0..e1e2280 100644 --- a/axzo-common-jackson/jackson-utility/pom.xml +++ b/axzo-common-jackson/jackson-utility/pom.xml @@ -5,7 +5,7 @@ axzo-common-jackson cn.axzo.framework.jackson - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -157,4 +157,4 @@ - \ No newline at end of file + diff --git a/axzo-common-jackson/pom.xml b/axzo-common-jackson/pom.xml index a83c3d1..c553240 100644 --- a/axzo-common-jackson/pom.xml +++ b/axzo-common-jackson/pom.xml @@ -5,7 +5,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -94,4 +94,4 @@ - \ No newline at end of file + diff --git a/axzo-common-loggings/axzo-common-trace/pom.xml b/axzo-common-loggings/axzo-common-trace/pom.xml index c7efbb1..e3e74f8 100644 --- a/axzo-common-loggings/axzo-common-trace/pom.xml +++ b/axzo-common-loggings/axzo-common-trace/pom.xml @@ -5,7 +5,7 @@ axzo-common-loggings cn.axzo.framework.logging - 1.0.0-SNAPSHOT + ${revision} axzo-common-trace Axzo Common trace diff --git a/axzo-common-loggings/log4j2-starter/pom.xml b/axzo-common-loggings/log4j2-starter/pom.xml index 69fc665..cb99d3c 100644 --- a/axzo-common-loggings/log4j2-starter/pom.xml +++ b/axzo-common-loggings/log4j2-starter/pom.xml @@ -7,7 +7,7 @@ axzo-common-loggings cn.axzo.framework.logging - 1.0.0-SNAPSHOT + ${revision} log4j2-starter @@ -35,4 +35,4 @@ true - \ No newline at end of file + diff --git a/axzo-common-loggings/logback-starter/pom.xml b/axzo-common-loggings/logback-starter/pom.xml index 94e8047..d1fbda6 100644 --- a/axzo-common-loggings/logback-starter/pom.xml +++ b/axzo-common-loggings/logback-starter/pom.xml @@ -7,7 +7,7 @@ axzo-common-loggings cn.axzo.framework.logging - 1.0.0-SNAPSHOT + ${revision} logback-starter @@ -19,4 +19,4 @@ spring-boot-starter-logging - \ No newline at end of file + diff --git a/axzo-common-loggings/pom.xml b/axzo-common-loggings/pom.xml index 81b55f1..7112e2f 100644 --- a/axzo-common-loggings/pom.xml +++ b/axzo-common-loggings/pom.xml @@ -5,7 +5,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -20,4 +20,4 @@ logback-starter axzo-common-trace - \ No newline at end of file + diff --git a/axzo-common-math/pom.xml b/axzo-common-math/pom.xml index a39907a..0f10086 100644 --- a/axzo-common-math/pom.xml +++ b/axzo-common-math/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-math diff --git a/axzo-common-rocketmq/pom.xml b/axzo-common-rocketmq/pom.xml index baec135..2d9f0a1 100644 --- a/axzo-common-rocketmq/pom.xml +++ b/axzo-common-rocketmq/pom.xml @@ -6,7 +6,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} cn.axzo.framework.rocketmq @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/axzo-common-validator/pom.xml b/axzo-common-validator/pom.xml index 6354142..3a38af6 100644 --- a/axzo-common-validator/pom.xml +++ b/axzo-common-validator/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-validator diff --git a/axzo-common-web/pom.xml b/axzo-common-web/pom.xml index c310905..e14c423 100644 --- a/axzo-common-web/pom.xml +++ b/axzo-common-web/pom.xml @@ -7,7 +7,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} axzo-common-web diff --git a/axzo-common-webmvc/pom.xml b/axzo-common-webmvc/pom.xml index d1a7453..52ba1bb 100644 --- a/axzo-common-webmvc/pom.xml +++ b/axzo-common-webmvc/pom.xml @@ -5,7 +5,7 @@ axzo-framework-commons cn.axzo.framework - 1.0.0-SNAPSHOT + ${revision} 4.0.0 @@ -73,4 +73,4 @@ provided - \ No newline at end of file + diff --git a/pom.xml b/pom.xml index 0a8d372..49a6f8e 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ cn.axzo.framework axzo-framework-commons - 1.0.0-SNAPSHOT + ${revision} pom Axzo Framework Commons @@ -40,7 +40,8 @@ 2.0.0-SNAPSHOT - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT + ${revision} From c6ff9bb1064ad319dce5ba421cfb08c8c8836baf Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 25 Jun 2024 22:48:02 +0800 Subject: [PATCH 12/19] =?UTF-8?q?feat:=20=E9=80=9A=E8=BF=87=20revision=20?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E7=89=88=E6=9C=AC=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 49a6f8e..ba6f7b5 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 2.0.0-SNAPSHOT - 1.0.1-SNAPSHOT + 1.0.0-SNAPSHOT ${revision} From 701614b2f9a39bbdbed4c5f4bce89285b35f0361 Mon Sep 17 00:00:00 2001 From: wangli Date: Tue, 25 Jun 2024 22:51:00 +0800 Subject: [PATCH 13/19] =?UTF-8?q?feat:=20spring.factories=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20FeignErrorDecoder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/META-INF/spring.factories | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/axzo-common-autoconfigure/src/main/resources/META-INF/spring.factories b/axzo-common-autoconfigure/src/main/resources/META-INF/spring.factories index 267add4..9233055 100644 --- a/axzo-common-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/axzo-common-autoconfigure/src/main/resources/META-INF/spring.factories @@ -16,5 +16,6 @@ cn.axzo.framework.autoconfigure.web.rest.EnumResource,\ cn.axzo.framework.autoconfigure.validation.SpringValidatorAutoConfiguration,\ cn.axzo.framework.autoconfigure.web.advice.BodyAdviceAutoConfiguration,\ cn.axzo.framework.autoconfigure.web.FilterAutoConfiguration,\ -cn.axzo.framework.autoconfigure.web.context.WebMvcAwareAutoConfiguration +cn.axzo.framework.autoconfigure.web.context.WebMvcAwareAutoConfiguration,\ +cn.axzo.framework.autoconfigure.feign.FeignErrorDecoderAutoConfiguration # cn.axzo.framework.autoconfigure.web.swagger.SwaggerAutoConfiguration,\ From 507a8966c83be4301323b59000e92db13bc9a04a Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 26 Jun 2024 09:55:44 +0800 Subject: [PATCH 14/19] =?UTF-8?q?feat(REQ-2516):=20=E8=B0=83=E6=95=B4=20He?= =?UTF-8?q?ader=20=E5=8F=96=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/exception/support/GlobalExceptionHandler.java | 2 +- .../src/main/java/cn/axzo/framework/boot/PackageVersion.java | 2 +- .../axzo/framework/jackson/datatype/enumstd/PackageVersion.java | 2 +- .../framework/jackson/datatype/fraction/PackageVersion.java | 2 +- .../axzo/framework/jackson/datatype/period/PackageVersion.java | 2 +- .../axzo/framework/jackson/datatype/string/PackageVersion.java | 2 +- .../src/main/java/cn/axzo/framework/jackson/PackageVersion.java | 2 +- .../filter/BasicRecordExceptionFilter.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index 1c97d25..976a37c 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -338,7 +338,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { headerValue = MDC.get(recordExceptionHeaderName); } log.info("recordException HeaderName: {}", headerValue); - return Boolean.parseBoolean(headerValue); + return headerValue.contains("debugging"); } private boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { diff --git a/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java b/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java index 85a0c95..d5855e5 100644 --- a/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java +++ b/axzo-common-boot/src/main/java/cn/axzo/framework/boot/PackageVersion.java @@ -7,7 +7,7 @@ package cn.axzo.framework.boot; */ public final class PackageVersion { - public final static String VERSION = "1.0.1-SNAPSHOT"; + public final static String VERSION = "1.0.0-SNAPSHOT"; public final static String SPRING_CLOUD_VERSION = "2020.0.6"; } \ No newline at end of file diff --git a/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java b/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java index 7fe0840..f624532 100644 --- a/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-enumstd/src/main/java/cn/axzo/framework/jackson/datatype/enumstd/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-enumstd"); + "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-enumstd"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java index 7d75572..2a4eb78 100644 --- a/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-fraction/src/main/java/cn/axzo/framework/jackson/datatype/fraction/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-fraction"); + "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-fraction"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java b/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java index ddd5cea..47c2dcf 100644 --- a/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-period/src/main/java/cn/axzo/framework/jackson/datatype/period/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-period"); + "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-period"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java index 553e8a7..03eeeda 100644 --- a/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java +++ b/axzo-common-jackson/jackson-datatype-string-trim/src/main/java/cn/axzo/framework/jackson/datatype/string/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-string-trim"); + "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-datatype-string-trim"); @Override public Version version() { diff --git a/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java b/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java index b819a08..0918924 100644 --- a/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java +++ b/axzo-common-jackson/jackson-starter/src/main/java/cn/axzo/framework/jackson/PackageVersion.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.util.VersionUtil; */ public final class PackageVersion implements Versioned { public final static Version VERSION = VersionUtil.parseVersion( - "1.0.1-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-starter"); + "1.0.0-SNAPSHOT", "cn.axzo.framework.jackson", "jackson-starter"); @Override public Version version() { diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java index 0f18ee2..0a94356 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/filter/BasicRecordExceptionFilter.java @@ -14,7 +14,7 @@ import java.io.IOException; /** - * TODO + * 用于入口请求收集记录异常开关信息 * * @author wangli * @since 2024/6/25 09:40 From 7f2d47d4b82b79d6de43970acc8ee189ca45e2d7 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 26 Jun 2024 10:00:46 +0800 Subject: [PATCH 15/19] =?UTF-8?q?feat(REQ-2516):=20=E9=99=8D=E7=BA=A7?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/FeignRecordExceptionInterceptor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java index 4a9ca6d..ae7da8a 100644 --- a/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java +++ b/axzo-common-web/src/main/java/cn.axzo.framework.web/feign/FeignRecordExceptionInterceptor.java @@ -62,7 +62,7 @@ public class FeignRecordExceptionInterceptor implements RequestInterceptor { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); return attributes.getRequest(); } catch (Exception e) { - log.warn("not HttpServletRequest instance bean found"); + log.debug("not HttpServletRequest instance bean found"); return null; } } From 2c176f465369a89c8a0c544bf48eaed05965ed69 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 26 Jun 2024 13:56:22 +0800 Subject: [PATCH 16/19] =?UTF-8?q?feat(REQ-2516):=20=E8=B0=83=E6=95=B4=20X-?= =?UTF-8?q?Metadata-Tag=20=E5=8F=82=E6=95=B0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/exception/support/GlobalExceptionHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index 976a37c..563ff8d 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -83,9 +83,10 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { * 多设置一个key = TraceId, value为traceId的变量到MDC. 以兼容目前的logback-spring.xml的配置 */ public static final String TRACE_ID_IN_MDC = "traceId"; + private static final String RECORD_FLAG = "debug"; - @Value("${axzo.framework.debugging:X-Metadata-Tag}") + @Value("${axzo.framework.debug:X-Metadata-Tag}") private String recordExceptionHeaderName; @Value("${spring.application.name:}") private String applicationName; @@ -338,7 +339,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { headerValue = MDC.get(recordExceptionHeaderName); } log.info("recordException HeaderName: {}", headerValue); - return headerValue.contains("debugging"); + return headerValue.contains(RECORD_FLAG); } private boolean shouldFilter(ExceptionResultHandler handler, Throwable e) { From 48225b1bd8aeacadd10839a5315eb98fbc8404b2 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 26 Jun 2024 15:30:27 +0800 Subject: [PATCH 17/19] =?UTF-8?q?feat(REQ-2516):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6=E8=AE=B0=E5=BD=95=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/exception/support/GlobalExceptionHandler.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index 563ff8d..55ada5c 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -339,6 +339,9 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { headerValue = MDC.get(recordExceptionHeaderName); } log.info("recordException HeaderName: {}", headerValue); + if(!StringUtils.hasText(headerValue)) { + return false; + } return headerValue.contains(RECORD_FLAG); } From d3b36b08bf50708158067a1497c62eb9ec3b4c98 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 1 Jul 2024 16:18:40 +0800 Subject: [PATCH 18/19] =?UTF-8?q?feat(REQ-2516):=20=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=80=9A=E8=BF=87=E6=96=B0=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=BF=9B=E8=A1=8C=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/support/GlobalExceptionHandler.java | 4 +--- .../framework/domain/web/result/ApiCoreResult.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index 55ada5c..55a035b 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -9,9 +9,7 @@ import cn.axzo.framework.domain.web.code.BaseCode; import cn.axzo.framework.domain.web.result.ApiResult; import cn.axzo.framework.domain.web.result.Result; import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import com.google.common.collect.Lists; import lombok.Data; @@ -302,7 +300,7 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { ApiResult err = err(512, "discovery server internal error"); Map recordExceptionMap = new HashMap<>(); recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", rebuildThrowable(e, request)); - err.setData(recordExceptionMap); + err.getAnalysis().putAll(recordExceptionMap); return err; } diff --git a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java index 55c90d4..436fab7 100644 --- a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java +++ b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java @@ -25,7 +25,7 @@ import static jodd.util.StringUtil.isNotBlank; @Data @NoArgsConstructor @AllArgsConstructor -@JsonPropertyOrder({"code", "msg", "data"}) +@JsonPropertyOrder({"code", "msg", "data", "analysis"}) public abstract class ApiCoreResult implements Result { @ApiModelProperty(value = "业务码", required = true, position = 1) @@ -37,6 +37,15 @@ public abstract class ApiCoreResult implements Result { @ApiModelProperty(value = "业务数据", position = 100) protected E data; + @ApiModelProperty(value = "异常记录信息", position = 101) + protected Map analysis = new HashMap<>(); + + protected ApiCoreResult(Integer code, String msg, E data) { + this.code = code; + this.msg = msg; + this.data = data; + } + @Transient protected IRespCode[] getOKCodes() { return new IRespCode[]{BaseCode.SUCCESS}; @@ -78,6 +87,7 @@ public abstract class ApiCoreResult implements Result { map.put("code", code); map.put("msg", msg); map.put("data", data); + map.put("analysis", analysis); return map; } From c5af495c89cfbdf8bdfc0e6d343a07e52e0d5ae4 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 8 Jul 2024 13:56:52 +0800 Subject: [PATCH 19/19] =?UTF-8?q?feat(REQ-2516):=20=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=80=9A=E8=BF=87=E6=96=B0=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=BF=9B=E8=A1=8C=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/GlobalExceptionHandler.java | 8 +- .../domain/web/result/ApiCoreResult.java | 12 +-- .../domain/web/result/ApiReportResult.java | 100 ++++++++++++++++++ 3 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiReportResult.java diff --git a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java index 55a035b..df3f6c9 100644 --- a/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java +++ b/axzo-common-autoconfigure/src/main/java/cn/axzo/framework/autoconfigure/web/exception/support/GlobalExceptionHandler.java @@ -6,7 +6,7 @@ import cn.axzo.framework.core.InternalException; import cn.axzo.framework.core.RecordException; import cn.axzo.framework.core.util.ClassUtil; import cn.axzo.framework.domain.web.code.BaseCode; -import cn.axzo.framework.domain.web.result.ApiResult; +import cn.axzo.framework.domain.web.result.ApiReportResult; import cn.axzo.framework.domain.web.result.Result; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; @@ -54,7 +54,7 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; -import static cn.axzo.framework.domain.web.result.ApiResult.err; +import static cn.axzo.framework.domain.web.result.ApiReportResult.err; import static cn.axzo.framework.web.filter.BasicRecordExceptionFilter.MICRO_SERVER_RECORD_ERROR_FILTER_PACKAGE_VALUE; import static cn.axzo.framework.web.filter.BasicRecordExceptionFilter.MICRO_SERVER_RECORD_ERROR_GET_PARAM_NAME; import static java.lang.String.format; @@ -297,10 +297,10 @@ public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { private Result buildResult(HttpServletRequest request, HttpServletResponse response, Throwable e) { response.setHeader(CACHE_CONTROL, "no-store"); response.setStatus(512); - ApiResult err = err(512, "discovery server internal error"); + ApiReportResult err = err(512, "discovery server internal error"); Map recordExceptionMap = new HashMap<>(); recordExceptionMap.put(StringUtils.hasText(applicationName) ? applicationName : "not applicationName found", rebuildThrowable(e, request)); - err.getAnalysis().putAll(recordExceptionMap); + err.setAnalysis(recordExceptionMap); return err; } diff --git a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java index 436fab7..55c90d4 100644 --- a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java +++ b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiCoreResult.java @@ -25,7 +25,7 @@ import static jodd.util.StringUtil.isNotBlank; @Data @NoArgsConstructor @AllArgsConstructor -@JsonPropertyOrder({"code", "msg", "data", "analysis"}) +@JsonPropertyOrder({"code", "msg", "data"}) public abstract class ApiCoreResult implements Result { @ApiModelProperty(value = "业务码", required = true, position = 1) @@ -37,15 +37,6 @@ public abstract class ApiCoreResult implements Result { @ApiModelProperty(value = "业务数据", position = 100) protected E data; - @ApiModelProperty(value = "异常记录信息", position = 101) - protected Map analysis = new HashMap<>(); - - protected ApiCoreResult(Integer code, String msg, E data) { - this.code = code; - this.msg = msg; - this.data = data; - } - @Transient protected IRespCode[] getOKCodes() { return new IRespCode[]{BaseCode.SUCCESS}; @@ -87,7 +78,6 @@ public abstract class ApiCoreResult implements Result { map.put("code", code); map.put("msg", msg); map.put("data", data); - map.put("analysis", analysis); return map; } diff --git a/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiReportResult.java b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiReportResult.java new file mode 100644 index 0000000..266ad7f --- /dev/null +++ b/axzo-common-domain/src/main/java/cn/axzo/framework/domain/web/result/ApiReportResult.java @@ -0,0 +1,100 @@ +package cn.axzo.framework.domain.web.result; + +import cn.axzo.framework.domain.web.ApiException; +import cn.axzo.framework.domain.web.code.IRespCode; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.beans.ConstructorProperties; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import static cn.axzo.framework.domain.web.code.BaseCode.SERVER_ERROR; +import static cn.axzo.framework.domain.web.code.BaseCode.SUCCESS; + +/** + * @Description + * @Author liyong.tian + * @Date 2020/9/7 20:33 + **/ +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class ApiReportResult extends ApiCoreResult { + + @ApiModelProperty(value = "异常记录信息", position = 101) + protected Map analysis = new HashMap<>(); + + public static ApiReportResult ok() { + return ok(null); + } + + public static ApiReportResult ok(E data) { + return build(SUCCESS, data); + } + + public static ApiReportResult err(IRespCode code) { + return err(code, code.getMessage()); + } + + public static ApiReportResult err(IRespCode code, String message) { + return err(Integer.parseInt(code.getRespCode()), message); + } + + public static ApiReportResult err(IRespCode code, E data) { + return build(Integer.parseInt(code.getRespCode()), code.getMessage(), data); + } + + public static ApiReportResult err(String message) { + return err(Integer.parseInt(SERVER_ERROR.getRespCode()), message); + } + + public static ApiReportResult err(Integer code, String message) { + if (code == null) { + return err(message); + } + return build(code, message, null); + } + + public static ApiReportResult build(IRespCode code) { + return build(code, null); + } + + public static ApiReportResult build(IRespCode code, E data) { + return build(Integer.parseInt(code.getRespCode()), code.getMessage(), data); + } + + public static ApiReportResult build(Integer code, String message, E data) { + return new ApiReportResult<>(code, message, data); + } + + public static ApiReportResult with(Throwable e) { + if (e != null && e instanceof ApiException) { + return err(((ApiException) e).getCode(), e.getMessage()); + } + if (e != null) { + return err(SERVER_ERROR, e.getMessage()); + } + return err(SERVER_ERROR); + } + + public ApiReportResult(Integer code, String msg, E data) { + super(code, msg, data); + } + + public Map getAnalysis() { + return analysis; + } + + public void setAnalysis(Map analysis) { + this.analysis = analysis; + } + + @Override + public Map toMap() { + Map map = super.toMap(); + map.put("analysis", getAnalysis()); + return map; + } +}