From 7e1ff1343d1ecee4aeb236aa07d14deb31e9502f Mon Sep 17 00:00:00 2001 From: Timi Date: Sat, 1 Aug 2026 01:12:18 +0800 Subject: [PATCH] v0.0.17 --- pom.xml | 12 ++- .../imyeyu/spring/util/BaseSQLProvider.java | 2 +- .../spring/util/GlobalExceptionHandler.java | 92 +++++++++++++++++-- .../spring/util/GlobalReturnHandler.java | 21 +---- 4 files changed, 97 insertions(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 1530817..5afe339 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.imyeyu.spring timi-spring - 0.0.16 + 0.0.17 jar @@ -143,6 +143,16 @@ timi-io 0.0.5 + + com.imyeyu.java + timi-java + 0.0.6 + + + com.imyeyu.lang + timi-lang + 0.0.5 + org.projectlombok lombok diff --git a/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java b/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java index 2364f6c..fa6597d 100644 --- a/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java +++ b/src/main/java/com/imyeyu/spring/util/BaseSQLProvider.java @@ -231,7 +231,7 @@ public abstract class BaseSQLProvider { Ref.setFieldValue(entity, fc.field, uuid); } } catch (IllegalAccessException e) { - throw new TimiException(TimiCode.ERROR).msgKey("auto set field:%s value error".formatted(fc.fieldName)); + throw new TimiException(TimiCode.ERROR, "auto set field:%s value error".formatted(fc.fieldName)); } if (entity instanceof Creatable creatableEntity && creatableEntity.getCreatedAt() == null) { creatableEntity.setCreatedAt(Time.now()); diff --git a/src/main/java/com/imyeyu/spring/util/GlobalExceptionHandler.java b/src/main/java/com/imyeyu/spring/util/GlobalExceptionHandler.java index f20b2eb..6058ac1 100644 --- a/src/main/java/com/imyeyu/spring/util/GlobalExceptionHandler.java +++ b/src/main/java/com/imyeyu/spring/util/GlobalExceptionHandler.java @@ -1,8 +1,11 @@ package com.imyeyu.spring.util; +import com.imyeyu.java.TimiJava; import com.imyeyu.java.bean.timi.TimiCode; +import com.imyeyu.java.bean.timi.TimiError; import com.imyeyu.java.bean.timi.TimiException; import com.imyeyu.java.bean.timi.TimiResponse; +import com.imyeyu.lang.message.MessageResolver; import com.imyeyu.spring.TimiSpring; import com.imyeyu.spring.annotation.IgnoreGlobalReturn; import jakarta.servlet.ServletException; @@ -11,6 +14,7 @@ import jakarta.validation.ValidationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.TypeMismatchException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.validation.BindException; @@ -30,10 +34,15 @@ public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + private final ObjectProvider messageResolverProvider; + /** * 创建全局异常处理器 + * + * @param messageResolverProvider 消息解析器提供器 */ - public GlobalExceptionHandler() { + public GlobalExceptionHandler(ObjectProvider messageResolverProvider) { + this.messageResolverProvider = messageResolverProvider; } @Value("${spring.profiles.active}") @@ -55,7 +64,7 @@ public class GlobalExceptionHandler { if (ignoreCommittedBinaryResponse()) { return null; } - return new TimiResponse<>(TimiCode.ARG_BAD).msgKey("invalid.body"); + return fail(TimiCode.ARG_BAD, "invalid.body"); } /** @@ -74,7 +83,7 @@ public class GlobalExceptionHandler { if (ignoreCommittedBinaryResponse()) { return null; } - return new TimiResponse<>(TimiCode.REQUEST_BAD).msgKey("invalid.request"); + return fail(TimiCode.REQUEST_BAD, "invalid.request"); } /** @@ -83,19 +92,20 @@ public class GlobalExceptionHandler { * @param e 异常 * @return 异常返回 */ + @IgnoreGlobalReturn @ExceptionHandler({BindException.class, ValidationException.class, MethodArgumentNotValidException.class, TypeMismatchException.class}) public TimiResponse paramsException(Exception e) { if (e instanceof MethodArgumentNotValidException subE) { log.warn("request error", e); FieldError error = subE.getBindingResult().getFieldError(); if (error != null) { - return new TimiResponse<>(TimiCode.ARG_BAD, "[%s] %s".formatted(error.getField(), error.getDefaultMessage())); + return fail(TimiCode.ARG_BAD, "[%s] %s".formatted(error.getField(), error.getDefaultMessage())); } } if (env.startsWith("dev") || log.isDebugEnabled()) { log.error("request error", e); } - return new TimiResponse<>(TimiCode.REQUEST_BAD).msgKey("invalid.arg"); + return fail(TimiCode.REQUEST_BAD, "invalid.arg"); } /** @@ -114,15 +124,81 @@ public class GlobalExceptionHandler { if (ignoreCommittedBinaryResponse()) { return null; } - // 一般异常 - return timiE.toResponse(); + return fail(timiE); + } + if (e instanceof TimiError timiE) { + log.error(timiE.getMessage(), e); + if (ignoreCommittedBinaryResponse()) { + return null; + } + return fail(timiE.getCode(), timiE.getMessageCode(), timiE.getMessageArgs()); } // 致命异常 log.error("fatal error", e); if (ignoreCommittedBinaryResponse()) { return null; } - return new TimiResponse<>(TimiCode.ERROR).msgKey("service.error"); + return fail(TimiCode.ERROR, "service.error"); + } + + /** + * 创建失败响应 + * + * @param e 异常 + * @return 响应 + */ + private TimiResponse fail(TimiException e) { + return fail(e.getCode(), e.getMessageCode(), e.getMessageArgs()); + } + + /** + * 创建失败响应 + * + * @param code 代码 + * @param messageCode 消息代码 + * @return 响应 + */ + private TimiResponse fail(TimiCode code, String messageCode) { + return fail(code, messageCode, null); + } + + /** + * 创建失败响应 + * + * @param code 代码 + * @param messageCode 消息代码 + * @param messageArgs 消息插值参数 + * @return 响应 + */ + private TimiResponse fail(TimiCode code, String messageCode, java.util.Map messageArgs) { + TimiResponse result = new TimiResponse<>(code).messageCode(messageCode, messageArgs); + result.setMessage(resolveMessage(code, messageCode, messageArgs)); + return result; + } + + /** + * 解析消息 + * + * @param code 代码 + * @param messageCode 消息代码 + * @param messageArgs 消息插值参数 + * @return 消息 + */ + private String resolveMessage(TimiCode code, String messageCode, java.util.Map messageArgs) { + if (TimiJava.isEmpty(messageCode)) { + return code.toString(); + } + try { + MessageResolver messageResolver = messageResolverProvider.getIfAvailable(); + if (messageResolver == null) { + return messageCode; + } + String message = messageResolver.resolve(messageCode, messageArgs, TimiSpring.getLanguage()); + return TimiJava.isEmpty(message) ? messageCode : message; + } catch (Exception e) { + log.error("message resolve error", e); + return messageCode; + } } /** diff --git a/src/main/java/com/imyeyu/spring/util/GlobalReturnHandler.java b/src/main/java/com/imyeyu/spring/util/GlobalReturnHandler.java index 99b5083..e24a84c 100644 --- a/src/main/java/com/imyeyu/spring/util/GlobalReturnHandler.java +++ b/src/main/java/com/imyeyu/spring/util/GlobalReturnHandler.java @@ -1,14 +1,10 @@ package com.imyeyu.spring.util; -import com.imyeyu.java.TimiJava; -import com.imyeyu.java.bean.CallbackArgReturn; -import com.imyeyu.java.bean.LanguageMsgMapping; import com.imyeyu.java.bean.timi.TimiCode; import com.imyeyu.java.bean.timi.TimiResponse; import com.imyeyu.spring.TimiSpring; import com.imyeyu.spring.annotation.AOPLogInterceptor; import com.imyeyu.spring.annotation.IgnoreGlobalReturn; -import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.MethodParameter; @@ -28,15 +24,11 @@ import java.util.Objects; * @author 夜雨 * @version 2023-04-30 00:59 */ -@Data @RestControllerAdvice public class GlobalReturnHandler implements ResponseBodyAdvice { private static final Logger log = LoggerFactory.getLogger(GlobalReturnHandler.class); - /** 多语言头处理回调 */ - private CallbackArgReturn, String> multilingualHeader; - /** * 创建全局返回处理器 */ @@ -59,23 +51,12 @@ public class GlobalReturnHandler implements ResponseBodyAdvice { { TimiResponse result; if (body instanceof TimiResponse timiResponse) { - // 可能已被全局异常包装 result = timiResponse; } else { result = new TimiResponse<>(TimiCode.SUCCESS, body); } - try { - if (multilingualHeader != null && TimiJava.isNotEmpty(result.getMsgKey())) { - result.setMsg(multilingualHeader.handler(result)); - } else if (TimiJava.isEmpty(result.getMsg())) { - result.setMsg(TimiCode.fromCode(result.getCode()).toString()); - } - } catch (Exception e) { - log.error("multilingual response error", e); - result.setMsg(TimiCode.fromCode(result.getCode()).toString()); - } if (30000 < result.getCode()) { - log.warn("ID: {} Response -> Exception.{}.{}", TimiSpring.getSessionAttr(AOPLogInterceptor.REQUEST_ID), result.getCode(), result.getMsg()); + log.warn("ID: {} Response -> Exception.{}.{}", TimiSpring.getSessionAttr(AOPLogInterceptor.REQUEST_ID), result.getCode(), result.getMessage()); } return result; } -- 2.54.0