From 60144341bafdd516ee9a6b73c6034c3ed5ef97a0 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Wed, 26 Aug 2026 14:54:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BD=E9=99=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...sourceOwnerBaseAuthenticationProvider.java | 4 +- .../config/MessageSourceConfiguration.java | 4 +- .../common/core/exception/ErrorCodes.java | 49 +++++++++++++++ .../core/exception/I18nBizException.java | 26 ++++++++ .../common/core/i18n/I18nLocaleFilter.java | 39 ++++++++++++ .../common/core/i18n/I18nLocaleUtils.java | 60 +++++++++++++++++++ ...ReloadableResourceBundleMessageSource.java | 36 +++++++++++ .../pjcloud/common/core/util/MsgUtils.java | 34 ++++------- ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../resources/i18n/messages_en.properties | 39 ++++++++++++ .../resources/i18n/messages_zh_CN.properties | 60 ++++++++++++------- .../resources/i18n/messages_zh_HK.properties | 39 ++++++++++++ ...oudSecurityMessageSourceConfiguration.java | 7 +-- .../resources/errors/messages_en.properties | 13 ++++ .../errors/messages_zh_HK.properties | 13 ++++ .../handle/GlobalBizExceptionHandler.java | 14 ++++- 16 files changed, 384 insertions(+), 54 deletions(-) create mode 100644 pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/exception/I18nBizException.java create mode 100644 pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/i18n/I18nLocaleFilter.java create mode 100644 pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/i18n/I18nLocaleUtils.java create mode 100644 pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/i18n/Utf8ReloadableResourceBundleMessageSource.java create mode 100644 pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_en.properties create mode 100644 pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_HK.properties create mode 100644 pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_en.properties create mode 100644 pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_zh_HK.properties diff --git a/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index afb4a3e2..cee3d23a 100644 --- a/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -77,8 +77,8 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider 0) { + lang = lang.substring(0, comma).trim(); + } + int semi = lang.indexOf(';'); + if (semi > 0) { + lang = lang.substring(0, semi).trim(); + } + if (lang.startsWith("en")) { + return Locale.ENGLISH; + } + if (lang.contains("hk") || lang.equals("zh-hk") || lang.equals("zh_hk")) { + return new Locale("zh", "HK"); + } + if (lang.contains("hant") || lang.equals("zh-tw") || lang.equals("zh_tw")) { + return new Locale("zh", "HK"); + } + return Locale.SIMPLIFIED_CHINESE; + } + + public static String toAcceptLanguage(Locale locale) { + if (locale == null) { + return "zh-CN"; + } + if (Locale.ENGLISH.equals(locale)) { + return "en"; + } + if ("HK".equalsIgnoreCase(locale.getCountry())) { + return "zh-HK"; + } + if (Locale.TRADITIONAL_CHINESE.equals(locale)) { + return "zh-HK"; + } + return "zh-CN"; + } + +} diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/i18n/Utf8ReloadableResourceBundleMessageSource.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/i18n/Utf8ReloadableResourceBundleMessageSource.java new file mode 100644 index 00000000..00a3f8b2 --- /dev/null +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/i18n/Utf8ReloadableResourceBundleMessageSource.java @@ -0,0 +1,36 @@ +package com.bsd.pjcloud.common.core.i18n; + +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.core.io.Resource; +import org.springframework.lang.Nullable; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.Properties; + +/** + * 强制以 UTF-8 读取 classpath 下 *.properties + */ +public class Utf8ReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource { + + public Utf8ReloadableResourceBundleMessageSource() { + setDefaultEncoding(StandardCharsets.UTF_8.name()); + } + + @Override + protected Properties loadProperties(Resource resource, String filename) throws IOException { + Properties props = newProperties(); + try (Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)) { + props.load(reader); + } + return props; + } + + @Override + public void setDefaultEncoding(@Nullable String defaultEncoding) { + super.setDefaultEncoding(StandardCharsets.UTF_8.name()); + } + +} diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/MsgUtils.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/MsgUtils.java index e7d8828d..a2d21a01 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/MsgUtils.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/MsgUtils.java @@ -2,46 +2,36 @@ package com.bsd.pjcloud.common.core.util; import lombok.experimental.UtilityClass; import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; import java.util.Locale; /** * i18n 工具类 - * - * @author pjcloud - * @date 2022/3/30 */ @UtilityClass public class MsgUtils { - /** - * 通过code 获取中文错误信息 - * @param code - * @return - */ public String getMessage(String code) { - MessageSource messageSource = SpringContextHolder.getBean("pjcloudMessageSource"); - return messageSource.getMessage(code, null, Locale.CHINA); + return getMessage(code, (Object[]) null); } - /** - * 通过code 和参数获取中文错误信息 - * @param code - * @return - */ public String getMessage(String code, Object... objects) { MessageSource messageSource = SpringContextHolder.getBean("pjcloudMessageSource"); - return messageSource.getMessage(code, objects, Locale.CHINA); + Locale locale = LocaleContextHolder.getLocale(); + if (locale == null) { + locale = Locale.SIMPLIFIED_CHINESE; + } + return messageSource.getMessage(code, objects, locale); } - /** - * security 通过code 和参数获取中文错误信息 - * @param code - * @return - */ public String getSecurityMessage(String code, Object... objects) { MessageSource messageSource = SpringContextHolder.getBean("securityMessageSource"); - return messageSource.getMessage(code, objects, Locale.CHINA); + Locale locale = LocaleContextHolder.getLocale(); + if (locale == null) { + locale = Locale.SIMPLIFIED_CHINESE; + } + return messageSource.getMessage(code, objects, locale); } } diff --git a/pjcloud-common/pjcloud-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pjcloud-common/pjcloud-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index e63a1fef..cf94f3ea 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pjcloud-common/pjcloud-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,6 +1,7 @@ com.bsd.pjcloud.common.core.config.AsyncConfiguration com.bsd.pjcloud.common.core.config.JacksonConfiguration com.bsd.pjcloud.common.core.config.MessageSourceConfiguration +com.bsd.pjcloud.common.core.config.I18nLocaleAutoConfiguration com.bsd.pjcloud.common.core.config.RestTemplateConfiguration com.bsd.pjcloud.common.core.config.ImmutableConfiguration com.bsd.pjcloud.common.core.util.SpringContextHolder diff --git a/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_en.properties b/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_en.properties new file mode 100644 index 00000000..8060dea0 --- /dev/null +++ b/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_en.properties @@ -0,0 +1,39 @@ +sys.user.update.passwordError=Incorrect old password, update failed +sys.user.query.error=Failed to get current user info +sys.user.import.succeed=Users imported. Default password is mobile number +sys.user.username.existing={0} username already exists +sys.user.phone.existing={0} mobile number already exists +sys.user.userInfo.empty={0} user info is empty +sys.dept.deptName.inexistence={0} department does not exist +sys.post.postName.inexistence={0} post does not exist +sys.post.nameOrCode.existing={0} {1} post name or code already exists +sys.role.roleName.inexistence={0} role does not exist +sys.role.nameOrCode.existing={0} {1} role name or code already exists +sys.param.delete.system=Built-in parameters cannot be deleted +sys.param.config.error={0} system parameter config error +sys.menu.delete.existing=Menu has children and cannot be deleted +sys.app.sms.often=Verification code sent too frequently +sys.app.phone.unregistered={0} mobile number is not registered +sys.dict.delete.system=Built-in dictionary items cannot be deleted +sys.dict.update.system=Built-in dictionary items cannot be modified +sys.connect.cp.dept.sync.error=Failed to fetch WeCom department list +sys.connect.cp.user.sync.error=Failed to fetch WeCom user list +app.user.userInfo.empty={0} user info is empty + +common.access.denied=Insufficient permissions +common.sql.error=Database error. Please contact administrator +common.system.error=System busy. Please try again later +sys.user.id.empty=User ID cannot be empty +sys.user.username.duplicate=Username already exists +sys.user.not.found=User does not exist +sys.user.cancelled=Your account has been cancelled +sys.person.name.empty=Name cannot be empty +sys.person.nickname.empty=Nickname cannot be empty +sys.person.name.invalid=Name supports Chinese or English (words may be separated by spaces, e.g. John Smith) +sys.person.nickname.invalid=Nickname supports Chinese or English (words may be separated by spaces, e.g. John Smith) +sys.person.name.too.long=Cannot exceed 32 characters +sys.user.password.old.empty=Old password cannot be empty +sys.user.password.new.empty=New password cannot be empty +sys.user.password.length=Password length must be 6-20 characters +sys.user.password.chars.only=Password can only contain letters and digits +sys.user.password.letter.digit=Password must contain both letters and digits diff --git a/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_CN.properties b/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_CN.properties index 0699ff52..ddc14f93 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_CN.properties +++ b/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_CN.properties @@ -1,21 +1,39 @@ -sys.user.update.passwordError=\u539F\u5BC6\u7801\u9519\u8BEF\uFF0C\u4FEE\u6539\u5931\u8D25 -sys.user.query.error=\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u5931\u8D25 -sys.user.import.succeed=\u7528\u6237\u5BFC\u5165\u6210\u529F\uFF0C\u9ED8\u8BA4\u5BC6\u7801\u4E3A\u624B\u673A\u53F7 -sys.user.username.existing={0} \u7528\u6237\u540D\u5DF2\u5B58\u5728 -sys.user.phone.existing={0} \u624b\u673a\u53f7\u5df2\u5b58\u5728 -sys.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A -sys.dept.deptName.inexistence={0} \u90E8\u95E8\u540D\u79F0\u4E0D\u5B58\u5728 -sys.post.postName.inexistence={0} \u5C97\u4F4D\u540D\u79F0\u4E0D\u5B58\u5728 -sys.post.nameOrCode.existing={0} {1} \u5C97\u4F4D\u540D\u6216\u5C97\u4F4D\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728 -sys.role.roleName.inexistence={0} \u89D2\u8272\u540D\u79F0\u4E0D\u5B58\u5728 -sys.role.nameOrCode.existing={0} {1} \u89D2\u8272\u540D\u6216\u89D2\u8272\u7F16\u7801\u5DF2\u7ECF\u5B58\u5728 -sys.param.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u53C2\u6570\u4E0D\u80FD\u5220\u9664 -sys.param.config.error={0} \u7CFB\u7EDF\u53C2\u6570\u914D\u7F6E\u9519\u8BEF -sys.menu.delete.existing=\u83DC\u5355\u542B\u6709\u4E0B\u7EA7\u4E0D\u80FD\u5220\u9664 -sys.app.sms.often=\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u9891\u7E41 -sys.app.phone.unregistered={0} \u624B\u673A\u53F7\u672A\u6CE8\u518C -sys.dict.delete.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u5220\u9664 -sys.dict.update.system=\u7CFB\u7EDF\u5185\u7F6E\u5B57\u5178\u9879\u76EE\u4E0D\u80FD\u4FEE\u6539 -sys.connect.cp.dept.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u90E8\u95E8\u5217\u8868\u5931\u8D25 -sys.connect.cp.user.sync.error=\u83B7\u53D6\u4F01\u4E1A\u5FAE\u4FE1\u7528\u6237\u5217\u8868\u5931\u8D25 -app.user.userInfo.empty={0} \u7528\u6237\u4FE1\u606F\u4E3A\u7A7A +sys.user.update.passwordError=原密码错误,修改失败 +sys.user.query.error=获取当前用户信息失败 +sys.user.import.succeed=用户导入成功,默认密码为手机号 +sys.user.username.existing={0} 用户名已存在 +sys.user.phone.existing={0} 手机号已存在 +sys.user.userInfo.empty={0} 用户信息为空 +sys.dept.deptName.inexistence={0} 部门名称不存在 +sys.post.postName.inexistence={0} 岗位名称不存在 +sys.post.nameOrCode.existing={0} {1} 岗位名或岗位编码已经存在 +sys.role.roleName.inexistence={0} 角色名称不存在 +sys.role.nameOrCode.existing={0} {1} 角色名或角色编码已经存在 +sys.param.delete.system=系统内置参数不能删除 +sys.param.config.error={0} 系统参数配置错误 +sys.menu.delete.existing=菜单含有下级不能删除 +sys.app.sms.often=验证码发送过频繁 +sys.app.phone.unregistered={0} 手机号未注册 +sys.dict.delete.system=系统内置字典项目不能删除 +sys.dict.update.system=系统内置字典项目不能修改 +sys.connect.cp.dept.sync.error=获取企业微信部门列表失败 +sys.connect.cp.user.sync.error=获取企业微信用户列表失败 +app.user.userInfo.empty={0} 用户信息为空 + +common.access.denied=权限不足,不允许访问 +common.sql.error=数据库调用异常,请联系管理员处理 +common.system.error=系统繁忙,请稍后再试 +sys.user.id.empty=用户ID不能为空 +sys.user.username.duplicate=该用户名已存在 +sys.user.not.found=用户不存在 +sys.user.cancelled=您已注销 +sys.person.name.empty=姓名不能为空 +sys.person.nickname.empty=昵称不能为空 +sys.person.name.invalid=姓名仅支持中文,或英文(单词间可用空格,如 John Smith) +sys.person.nickname.invalid=昵称仅支持中文,或英文(单词间可用空格,如 John Smith) +sys.person.name.too.long=不能超过32个字符 +sys.user.password.old.empty=原密码不能为空 +sys.user.password.new.empty=新密码不能为空 +sys.user.password.length=密码长度需为6-20位 +sys.user.password.chars.only=密码只能包含字母和数字 +sys.user.password.letter.digit=密码需同时包含字母和数字 diff --git a/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_HK.properties b/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_HK.properties new file mode 100644 index 00000000..9b619350 --- /dev/null +++ b/pjcloud-common/pjcloud-common-core/src/main/resources/i18n/messages_zh_HK.properties @@ -0,0 +1,39 @@ +sys.user.update.passwordError=原密碼錯誤,修改失敗 +sys.user.query.error=獲取當前用戶資訊失敗 +sys.user.import.succeed=用戶導入成功,預設密碼為手機號 +sys.user.username.existing={0} 用戶名已存在 +sys.user.phone.existing={0} 手機號已存在 +sys.user.userInfo.empty={0} 用戶資訊為空 +sys.dept.deptName.inexistence={0} 部門名稱不存在 +sys.post.postName.inexistence={0} 崗位名稱不存在 +sys.post.nameOrCode.existing={0} {1} 崗位名或崗位編碼已經存在 +sys.role.roleName.inexistence={0} 角色名稱不存在 +sys.role.nameOrCode.existing={0} {1} 角色名或角色編碼已經存在 +sys.param.delete.system=系統內置參數不能刪除 +sys.param.config.error={0} 系統參數配置錯誤 +sys.menu.delete.existing=菜單含有下級不能刪除 +sys.app.sms.often=驗證碼發送過頻繁 +sys.app.phone.unregistered={0} 手機號未註冊 +sys.dict.delete.system=系統內置字典項目不能刪除 +sys.dict.update.system=系統內置字典項目不能修改 +sys.connect.cp.dept.sync.error=獲取企業微信部門列表失敗 +sys.connect.cp.user.sync.error=獲取企業微信用戶列表失敗 +app.user.userInfo.empty={0} 用戶資訊為空 + +common.access.denied=權限不足,不允許訪問 +common.sql.error=資料庫調用異常,請聯繫管理員處理 +common.system.error=系統繁忙,請稍後再試 +sys.user.id.empty=用戶ID不能為空 +sys.user.username.duplicate=該用戶名已存在 +sys.user.not.found=用戶不存在 +sys.user.cancelled=您已註銷 +sys.person.name.empty=姓名不能為空 +sys.person.nickname.empty=暱稱不能為空 +sys.person.name.invalid=姓名僅支援中文,或英文(單詞間可用空格,如 John Smith) +sys.person.nickname.invalid=暱稱僅支援中文,或英文(單詞間可用空格,如 John Smith) +sys.person.name.too.long=不能超過32個字符 +sys.user.password.old.empty=原密碼不能為空 +sys.user.password.new.empty=新密碼不能為空 +sys.user.password.length=密碼長度需為6-20位 +sys.user.password.chars.only=密碼只能包含字母和數字 +sys.user.password.letter.digit=密碼需同時包含字母和數字 diff --git a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudSecurityMessageSourceConfiguration.java b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudSecurityMessageSourceConfiguration.java index ade5fa75..4819af76 100644 --- a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudSecurityMessageSourceConfiguration.java +++ b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudSecurityMessageSourceConfiguration.java @@ -16,14 +16,12 @@ package com.bsd.pjcloud.common.security.component; +import com.bsd.pjcloud.common.core.i18n.Utf8ReloadableResourceBundleMessageSource; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; -import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.util.Locale; - import static org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type.SERVLET; /** @@ -37,9 +35,8 @@ public class PjcloudSecurityMessageSourceConfiguration implements WebMvcConfigur @Bean public MessageSource securityMessageSource() { - ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); + Utf8ReloadableResourceBundleMessageSource messageSource = new Utf8ReloadableResourceBundleMessageSource(); messageSource.addBasenames("classpath:errors/messages"); - messageSource.setDefaultLocale(Locale.CHINA); return messageSource; } diff --git a/pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_en.properties b/pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_en.properties new file mode 100644 index 00000000..3278de58 --- /dev/null +++ b/pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_en.properties @@ -0,0 +1,13 @@ +AbstractAccessDecisionManager.accessDenied=Insufficient permissions +AbstractAccessDecisionManager.expireToken=Token expired +AbstractUserDetailsAuthenticationProvider.badCredentials=Incorrect username or password +AbstractUserDetailsAuthenticationProvider.badClientCredentials=Invalid client credentials +AbstractUserDetailsAuthenticationProvider.smsBadCredentials=User does not exist +AbstractUserDetailsAuthenticationProvider.credentialsExpired=Credentials have expired +OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired=Credentials have expired +AbstractUserDetailsAuthenticationProvider.disabled=User is not activated +AbstractUserDetailsAuthenticationProvider.locked=User account is locked +AbstractUserDetailsAuthenticationProvider.expired=User account has expired +JdbcDaoImpl.notFound=User {0} not found +UserDetailsService.notFound=User does not exist +RegisteredClient.notFound=Client not found diff --git a/pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_zh_HK.properties b/pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_zh_HK.properties new file mode 100644 index 00000000..ee158b63 --- /dev/null +++ b/pjcloud-common/pjcloud-common-security/src/main/resources/errors/messages_zh_HK.properties @@ -0,0 +1,13 @@ +AbstractAccessDecisionManager.accessDenied=權限不足,不允許訪問 +AbstractAccessDecisionManager.expireToken=Token 已過期 +AbstractUserDetailsAuthenticationProvider.badCredentials=帳號或密碼錯誤 +AbstractUserDetailsAuthenticationProvider.badClientCredentials=客戶端資訊錯誤 +AbstractUserDetailsAuthenticationProvider.smsBadCredentials=用戶不存在,登入失敗 +AbstractUserDetailsAuthenticationProvider.credentialsExpired=用戶憑證已過期 +OAuth2ResourceOwnerBaseAuthenticationProvider.tokenExpired=用戶憑證已過期 +AbstractUserDetailsAuthenticationProvider.disabled=用戶未啟用 +AbstractUserDetailsAuthenticationProvider.locked=用戶帳號已鎖定 +AbstractUserDetailsAuthenticationProvider.expired=用戶帳號已過期 +JdbcDaoImpl.notFound=未找到用戶{0} +UserDetailsService.notFound=用戶不存在 +RegisteredClient.notFound=客戶端資訊查詢失敗 diff --git a/pjcloud-common/pjcloud-common-sentinel/src/main/java/com/bsd/pjcloud/common/sentinel/handle/GlobalBizExceptionHandler.java b/pjcloud-common/pjcloud-common-sentinel/src/main/java/com/bsd/pjcloud/common/sentinel/handle/GlobalBizExceptionHandler.java index 0d172c1d..b5c4a3f8 100644 --- a/pjcloud-common/pjcloud-common-sentinel/src/main/java/com/bsd/pjcloud/common/sentinel/handle/GlobalBizExceptionHandler.java +++ b/pjcloud-common/pjcloud-common-sentinel/src/main/java/com/bsd/pjcloud/common/sentinel/handle/GlobalBizExceptionHandler.java @@ -19,6 +19,9 @@ package com.bsd.pjcloud.common.sentinel.handle; import com.alibaba.csp.sentinel.Tracer; import com.fasterxml.jackson.databind.ObjectMapper; +import com.bsd.pjcloud.common.core.exception.ErrorCodes; +import com.bsd.pjcloud.common.core.exception.I18nBizException; +import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import feign.FeignException; import lombok.SneakyThrows; @@ -43,6 +46,13 @@ public class GlobalBizExceptionHandler { private final ObjectMapper objectMapper = new ObjectMapper(); + @ExceptionHandler(I18nBizException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public R handleI18nBizException(I18nBizException e) { + log.warn("业务异常 code={}", e.getCode()); + return R.failed(e.resolveMessage()); + } + /** * 全局异常. * @@ -70,7 +80,7 @@ public class GlobalBizExceptionHandler { @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public R handleSQLException(SQLException exception) { log.error("数据库调用异常 ex={}", exception.getMessage(), exception); - return R.failed("数据库调用异常,请联系管理员处理"); + return R.failed(MsgUtils.getMessage(ErrorCodes.COMMON_SQL_ERROR)); } @SneakyThrows @@ -99,7 +109,7 @@ public class GlobalBizExceptionHandler { @ResponseStatus(HttpStatus.FORBIDDEN) public R handleAccessDeniedException(AccessDeniedException e) { log.error("拒绝授权异常信息 ex={}", e.getMessage()); - return R.failed("权限不足,不允许访问"); + return R.failed(MsgUtils.getMessage(ErrorCodes.COMMON_ACCESS_DENIED)); } /**