Bladeren bron

新增接口国际化

tsurumure 3 maanden geleden
bovenliggende
commit
f60c030ec9

+ 1 - 0
src/main/java/com/backendsys/config/Locale/LocaleConfig.java

@@ -11,6 +11,7 @@ import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
 public class LocaleConfig implements WebMvcConfigurer {
     @Bean
     public LocaleResolver localeResolver() {
+        System.out.println();
         return new CustomCookieLocaleResolver();
     }
     @Override

+ 17 - 5
src/main/java/com/backendsys/exception/GlobalExceptionHandler.java

@@ -3,6 +3,7 @@ package com.backendsys.exception;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
 import com.backendsys.modules.dingtalk.utils.DingTalkUtil;
+import com.backendsys.utils.response.ResultEnumService;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.backendsys.utils.response.Result;
 import com.backendsys.utils.response.ResultEnum;
@@ -51,6 +52,9 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
     @Autowired
     private ObjectMapper objectMapper;
 
+    @Autowired
+    private ResultEnumService resultEnumService;
+
     /**
      * 是否开启功能 true:开启
      */
@@ -276,6 +280,9 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
         return Result.error(ResultEnum.AUTH_ERROR.getCode(), e.getMessage());
     }
 
+
+
+    
     /**
      * 权限异常
      */
@@ -283,7 +290,8 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
     public Result handleAccessDeniedException(AccessDeniedException e) {
         System.out.println("****** AccessDeniedException.class: ******");
         printWarnException(e);
-        return Result.error(ResultEnum.AUTH_ROLE_ERROR.getCode(), ResultEnum.AUTH_ROLE_ERROR.getMessage());
+//        return Result.error(ResultEnum.AUTH_ROLE_ERROR.getCode(), ResultEnum.AUTH_ROLE_ERROR.getMessage());
+        return Result.error(ResultEnum.AUTH_ROLE_ERROR.getCode(), resultEnumService.getMessage(ResultEnum.AUTH_ROLE_ERROR));
     }
 
 
@@ -313,10 +321,12 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
                     System.out.println(sqlException.getMessage() + ", 参数类型不匹配");
                     log.error(sqlException.getMessage() + ", 参数类型不匹配");
                 }
-                return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), ResultEnum.INTERNAL_ERROR.getMessage(), sqlException.getMessage());
+//                return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), ResultEnum.INTERNAL_ERROR.getMessage(), sqlException.getMessage());
+                return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), resultEnumService.getMessage(ResultEnum.INTERNAL_ERROR), sqlException.getMessage());
             } else {
                 // [抛出异常] 实体类缺少字段
-                return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), ResultEnum.INTERNAL_ERROR.getMessage(), cause.getMessage());
+//                return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), ResultEnum.INTERNAL_ERROR.getMessage(), cause.getMessage());
+                return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), resultEnumService.getMessage(ResultEnum.INTERNAL_ERROR), cause.getMessage());
             }
         }
         return Result.error(ResultEnum.INTERNAL_ERROR.getCode(), e.getMessage());
@@ -360,7 +370,8 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
     public Result handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
         System.out.println("****** HttpRequestMethodNotSupportedException.class: ******");
         printWarnException(e);
-        return Result.error(ResultEnum.HTTP_METHOD_ERROR.getCode(), ResultEnum.HTTP_METHOD_ERROR.getMessage());
+//        return Result.error(ResultEnum.HTTP_METHOD_ERROR.getCode(), ResultEnum.HTTP_METHOD_ERROR.getMessage());
+        return Result.error(ResultEnum.HTTP_METHOD_ERROR.getCode(), resultEnumService.getMessage(ResultEnum.HTTP_METHOD_ERROR));
     }
 
     /**
@@ -378,7 +389,8 @@ public class GlobalExceptionHandler implements ResponseBodyAdvice<Object> {
     public Result handleIllegalArgumentException(IllegalArgumentException e) {
         System.out.println("****** IllegalArgumentException.class: ******");
         printErrorException(e);
-        return Result.error(ResultEnum.PARAMETER_EXCEPTION.getCode(), ResultEnum.PARAMETER_EXCEPTION.getMessage(), e.getMessage());
+//        return Result.error(ResultEnum.PARAMETER_EXCEPTION.getCode(), ResultEnum.PARAMETER_EXCEPTION.getMessage(), e.getMessage());
+        return Result.error(ResultEnum.PARAMETER_EXCEPTION.getCode(), resultEnumService.getMessage(ResultEnum.PARAMETER_EXCEPTION), e.getMessage());
     }
 
     // 优先级太高,会覆盖其他异常

+ 6 - 10
src/main/java/com/backendsys/modules/common/config/security/filter/JwtAuthenticationFilter.java

@@ -68,6 +68,9 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
     @Value("${REDIS_LOGIN_TOKEN_PREFIX}")
     private String REDIS_LOGIN_TOKEN_PREFIX;
 
+    @Value("${DEFAULT_LANGUAGE}")
+    private String DEFAULT_LANGUAGE;
+
     @Autowired
     private AnonymousProperties anonymousProperties;
 
@@ -181,17 +184,10 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
 
     }
 
-    private void handleError(HttpServletRequest request, HttpServletResponse response, ResultEnum resultEnum) throws IOException {
-
-//        String lang = CookieUtil.getCookie("lang", request);
-//        System.out.println("(handleError) lang = " + lang);
-//
-//        String message = resultEnumService.getMessage(resultEnum, lang);
-//        System.out.println("message = " + message);
-//
-//        Result result = Result.error(resultEnum.getCode(), message);
+    private void handleError(HttpServletRequest request, HttpServletResponse response, ResultEnum resultEnumKey) throws IOException {
 
-        Result result = Result.error(resultEnum.getCode(), resultEnum.getMessage());
+        Result result = Result.error(resultEnumKey.getCode(), resultEnumService.getMessage(resultEnumKey));
+//        Result result = Result.error(resultEnum.getCode(), resultEnum.getMessage());
 
         response.setContentType("application/json;charset=utf-8");
         response.getWriter().write(new ObjectMapper().writeValueAsString(result));

+ 27 - 39
src/main/java/com/backendsys/utils/response/ResultEnum.java

@@ -5,45 +5,33 @@ package com.backendsys.utils.response;
  */
 public enum ResultEnum {
 
-    /* 成功状态码 */
-    SUCCESS(200, "成功"),
-
-    /* 错误状态码 */
-    NOT_FOUND(404, "请求的资源不存在"),
-    AUTH_ERROR(401, "授权失败!"),
-    AUTH_ROLE_ERROR(403, "该用户角色没有访问权限"),
-    AUTH_USER_ERROR(403, "该用户不可操作"),
-    /**
-     * 用户权限枚举
-     */
-    TOKEN_EMPTY_ERROR(401, "请先登录获取有效的Token"),
-    INVALID_CREDENTIALS(402, "用户名或密码错误"),
-    LOCK_CREDENTIALS(4024, "错误次数过多,为账号安全,请等待1分钟后重新尝试"),
-
-    CAPTCHA_ERROR(403, "验证码错误"),
-    UNIQUE_FIELD(409, "唯一字段已存在"),
-
-    HTTP_BODY_EMPTY(420, "请求体参数不能为空"),
-    HTTP_METHOD_ERROR(421, "请求方法不支持"),
-
-    TOKEN_EXPIRED(440, "Token已过期,请重新登录", "result.token.invalid"),
-
-    TOKEN_INVALID(441, "Token已失效,请重新登录"),
-    TOKEN_FORMAT_EXCEPTION(442, "Token格式异常"),
-    TOKEN_FORMAT_INCORRECT(443, "Token格式不正确"),
-
-
-    STATUS_CONFLICT(409, "资源冲突"),
-    STATUS_ERROR(499, "资源状态暂不可用"),
-    INTERNAL_ERROR(500, "服务器内部错误"),
-    PARAMETER_EXCEPTION(6001, "参数校验异常"),
-    REMOTE_EXCEPTION(6002, "远程资源异常"),
-    NULL_POINTER(7001, "空指针异常"),
-    REFLECTION_EXCEPTION(8001, "Mybatis反射操作异常"),
-    SERVICE_EXCEPTION(502, "远程服务器错误"),
-    SERVER_BUSY(503, "服务器正忙,请稍后再试!"),
-    DATABASE_OPERATION_FAILED(504, "数据库操作失败"),
-    REDIS_ERROR(601, "Redis Error");
+    SUCCESS(200, "成功", "result.success"),
+    NOT_FOUND(404, "请求的资源不存在", "result.not.found"),
+    AUTH_ERROR(401, "授权失败!", "result.auth.error"),
+    AUTH_ROLE_ERROR(403, "该用户角色没有访问权限", "result.auth.role.error"),
+    AUTH_USER_ERROR(403, "该用户不可操作", "result.auth.user.error"),
+    TOKEN_EMPTY_ERROR(401, "请先登录获取有效的Token", "result.token.empty.error"),
+    INVALID_CREDENTIALS(402, "用户名或密码错误", "result.invalid.credentials"),
+    LOCK_CREDENTIALS(4024, "错误次数过多,为账号安全,请等待1分钟后重新尝试", "result.lock.credentials"),
+    CAPTCHA_ERROR(403, "验证码错误", "result.captcha.error"),
+    UNIQUE_FIELD(409, "唯一字段已存在", "result.unique.field"),
+    HTTP_BODY_EMPTY(420, "请求体参数不能为空", "result.http.body.empty"),
+    HTTP_METHOD_ERROR(421, "请求方法不支持", "result.http.method.error"),
+    TOKEN_EXPIRED(440, "Token已过期,请重新登录", "result.token.expired"),
+    TOKEN_INVALID(441, "Token已失效,请重新登录", "result.token.invalid"),
+    TOKEN_FORMAT_EXCEPTION(442, "Token格式异常", "result.token.format.exception"),
+    TOKEN_FORMAT_INCORRECT(443, "Token格式不正确", "result.token.format.incorrect"),
+    STATUS_CONFLICT(409, "资源冲突", "result.status.conflict"),
+    STATUS_ERROR(499, "资源状态暂不可用", "result.status.error"),
+    INTERNAL_ERROR(500, "服务器内部错误", "result.internal.error"),
+    PARAMETER_EXCEPTION(6001, "参数校验异常", "result.parameter.exception"),
+    REMOTE_EXCEPTION(6002, "远程资源异常", "result.remote.exception"),
+    NULL_POINTER(7001, "空指针异常", "result.null.pointer"),
+    REFLECTION_EXCEPTION(8001, "Mybatis反射操作异常", "result.reflection.exception"),
+    SERVICE_EXCEPTION(502, "远程服务器错误", "result.service.exception"),
+    SERVER_BUSY(503, "服务器正忙,请稍后再试!", "result.server.busy"),
+    DATABASE_OPERATION_FAILED(504, "数据库操作失败", "result.database.operation.failed"),
+    REDIS_ERROR(601, "Redis Error", "result.redis.error");
 
     private int code;
     private String message;

+ 34 - 2
src/main/java/com/backendsys/utils/response/ResultEnumService.java

@@ -1,14 +1,18 @@
 package com.backendsys.utils.response;
 
+import jakarta.servlet.http.HttpServletRequest;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.MessageSource;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.util.Locale;
 
 /**
- * 定义 ResultEnumService 获取国际化消息
+ * 使用 ResultEnumService 获取枚举类的国际化消息
  */
 @Service
 public class ResultEnumService {
@@ -16,8 +20,36 @@ public class ResultEnumService {
     @Autowired
     private MessageSource messageSource;
 
+    @Value("${DEFAULT_LANGUAGE}")
+    private String DEFAULT_LANGUAGE;
+
+    /**
+     * 如果枚举类没有设置国际化消息,返回默认值
+     * com/backendsys/utils/response/ResultEnum.java
+     * TOKEN_INVALID(441, "Token已失效,请重新登录"),
+     * TOKEN_INVALID(441, "Token已失效,请重新登录", "result.token.invalid"),
+     */
     public String getMessage(ResultEnum resultEnum, String lang) {
-        return messageSource.getMessage(resultEnum.getMessageKey(), null, new Locale(lang));
+        String message_key = resultEnum.getMessageKey();
+        if (message_key != null) {
+            return messageSource.getMessage(message_key, null, new Locale(lang));
+        } else {
+            return resultEnum.getMessage();
+        }
+    }
+    public String getMessage(ResultEnum resultEnum) {
+        // 获取当前线程绑定的request对象
+        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+        // 从 Headers 中获取 lang 值
+        String lang = request.getHeader("lang");
+        if (lang == null || lang.isEmpty()) lang = DEFAULT_LANGUAGE;
+
+        String message_key = resultEnum.getMessageKey();
+        if (message_key != null) {
+            return messageSource.getMessage(message_key, null, new Locale(lang));
+        } else {
+            return resultEnum.getMessage();
+        }
     }
 
 }

+ 27 - 1
src/main/resources/i18n/locale_en.properties

@@ -1,4 +1,30 @@
-result.token.invalid = Token is invalid, please log in again
+result.success=Success
+result.not.found=The requested resource does not exist
+result.auth.error=Authentication failed!
+result.auth.role.error=The user role does not have access permission
+result.auth.user.error=The user is not allowed to operate
+result.token.empty.error=Please log in to obtain a valid Token first
+result.invalid.credentials=Username or password is incorrect
+result.lock.credentials=Too many errors. For account security, please try again after 1 minute
+result.captcha.error=CAPTCHA is incorrect
+result.unique.field=The unique field already exists
+result.http.body.empty=Request body parameters cannot be empty
+result.http.method.error=Request method is not supported
+result.token.expired=Token has expired. Please log in again
+result.token.invalid=Token is invalid. Please log in again
+result.token.format.exception=Token format is abnormal
+result.token.format.incorrect=Token format is incorrect
+result.status.conflict=Resource conflict
+result.status.error=Resource status is temporarily unavailable
+result.internal.error=Internal server error
+result.parameter.exception=Parameter validation exception
+result.remote.exception=Remote resource exception
+result.null.pointer=Null pointer exception
+result.reflection.exception=Mybatis reflection operation exception
+result.service.exception=Remote server error
+result.server.busy=Server is busy. Please try again later!
+result.database.operation.failed=Database operation failed
+result.redis.error=Redis Error
 
 all = All
 more = More

+ 27 - 1
src/main/resources/i18n/locale_zh-tw.properties

@@ -1,4 +1,30 @@
-result.token.invalid = Token已失效,請重新登入
+result.success=成功
+result.not.found=請求的資源不存在
+result.auth.error=授權失敗!
+result.auth.role.error=該用戶角色沒有訪問權限
+result.auth.user.error=該用戶不可操作
+result.token.empty.error=請先登入獲取有效的Token
+result.invalid.credentials=用戶名或密碼錯誤
+result.lock.credentials=錯誤次數過多,為帳號安全,請等待1分鐘後重新嘗試
+result.captcha.error=驗證碼錯誤
+result.unique.field=唯一欄位已存在
+result.http.body.empty=請求體參數不能為空
+result.http.method.error=請求方法不支援
+result.token.expired=Token已過期,請重新登入
+result.token.invalid=Token已失效,請重新登入
+result.token.format.exception=Token格式異常
+result.token.format.incorrect=Token格式不正確
+result.status.conflict=資源衝突
+result.status.error=資源狀態暫不可用
+result.internal.error=伺服器內部錯誤
+result.parameter.exception=參數校驗異常
+result.remote.exception=遠程資源異常
+result.null.pointer=空指針異常
+result.reflection.exception=Mybatis反射操作異常
+result.service.exception=遠程伺服器錯誤
+result.server.busy=伺服器正忙,請稍後再試!
+result.database.operation.failed=數據庫操作失敗
+result.redis.error=Redis Error
 
 all = 全部
 more = 更多

+ 27 - 1
src/main/resources/i18n/locale_zh.properties

@@ -1,4 +1,30 @@
-result.token.invalid = Token已失效,请重新登录
+result.success=成功
+result.not.found=请求的资源不存在
+result.auth.error=授权失败!
+result.auth.role.error=该用户角色没有访问权限
+result.auth.user.error=该用户不可操作
+result.token.empty.error=请先登录获取有效的Token
+result.invalid.credentials=用户名或密码错误
+result.lock.credentials=错误次数过多,为账号安全,请等待1分钟后重新尝试
+result.captcha.error=验证码错误
+result.unique.field=唯一字段已存在
+result.http.body.empty=请求体参数不能为空
+result.http.method.error=请求方法不支持
+result.token.expired=Token已过期,请重新登录
+result.token.invalid=Token已失效,请重新登录
+result.token.format.exception=Token格式异常
+result.token.format.incorrect=Token格式不正确
+result.status.conflict=资源冲突
+result.status.error=资源状态暂不可用
+result.internal.error=服务器内部错误
+result.parameter.exception=参数校验异常
+result.remote.exception=远程资源异常
+result.null.pointer=空指针异常
+result.reflection.exception=Mybatis反射操作异常
+result.service.exception=远程服务器错误
+result.server.busy=服务器正忙,请稍后再试!
+result.database.operation.failed=数据库操作失败
+result.redis.error=Redis Error
 
 all = 全部
 more = 更多