Spring Boot 全局异常处理多语言错误码的核心是用枚举定义错误码(如 USER_NOT_FOUND)、自定义异常携带码与参数、MessageSource 按 Locale 动态解析 i18n 资源文件文案,并在 @RestControllerAdvice 中返回含本地化 msg 和原始 code 的统一响应。

Spring Boot 中全局异常处理多语言错误码,核心是把“错误码”和“语言环境”联动起来,而不是直接抛出固定字符串。关键不在捕获异常本身,而在于异常携带可翻译的标识,并在处理器里按当前 Locale 查找对应文案。
用错误码代替硬编码提示
抛异常时不写死中文或英文,而是只传一个唯一错误码(如 USER_NOT_FOUND)和可选参数(如用户 ID)。这样业务代码干净,后续增删语言也不动逻辑。
- 定义枚举类 ResultEnum,统一管理所有错误码、默认提示(仅作兜底)、HTTP 状态码
- 自定义异常类(如 BusinessException)构造时只接收枚举项或错误码字符串,不接受原始消息
- Service 或 Controller 中直接抛:
throw new BusinessException(ResultEnum.USER_NOT_FOUND, userId);
靠 MessageSource 动态解析多语言文案
Spring 的 MessageSource 是实现多语言的核心组件。它根据当前 Locale 自动加载对应 properties 文件里的文案,并支持占位符替换。
- 资源文件放在
src/main/resources/i18n/下,命名如:messages_zh_CN.properties、messages_en_US.properties - 文件内容示例:
user.not.found=用户不存在,ID:{0}和user.not.found=User not found, ID: {0} - 配置 ResourceBundleMessageSource Bean,指定 basename 为
i18n/messages,并启用 fallback
从请求头提取语言并传递到异常处理器
前端需在请求头中声明语言(如 X-App-Lang: en-US),后端解析成 Locale 并注入到 MessageSource 查找上下文中。
- 写一个工具类或 AOP 切面,在请求进入时读取请求头,设置当前线程的 Locale(可通过 LocaleContextHolder)
- 全局异常处理器(@RestControllerAdvice)中,调用
messageSource.getMessage(code, args, locale)获取本地化消息 - 若未传语言头,默认使用系统配置的 fallback locale(如 zh-CN)
统一响应结构里返回翻译后的错误信息
异常处理器最终封装的响应体,必须包含可读的多语言提示,而不是原始错误码。前端无需做任何翻译工作。
- 响应对象(如 Result
)的 msg字段填入 MessageSource 解析后的字符串,不是枚举里的默认值 - 同时保留
code字段(如"USER_NOT_FOUND"),供前端做逻辑判断或埋点,但不用于展示 - 对校验异常(MethodArgumentNotValidException)等框架异常,也按同样方式提取字段错误码,映射到 i18n 配置


















