Spring Boot 全局异常国际化关键在于统一异常处理器中按请求语言动态查翻译:配置i18n/messages_*.properties资源文件,通过spring.messages.basename启用ResourceBundleMessageSource,利用Accept-Language自动解析Locale,并在@ExceptionHandler中调用messageSource.getMessage()实现动态翻译。

Spring Boot 中实现全局异常返回国际化信息,关键是把语言解析、资源加载和异常响应三者串起来——不是在抛异常时硬编码多语言文案,而是统一在异常处理器里按请求语言动态查翻译。
配置多语言资源文件
在 src/main/resources/i18n/ 下创建标准命名的 properties 文件:
-
messages_zh_CN.properties:例如
error.user.not.found=用户不存在,ID:{0} -
messages_en_US.properties:例如
error.user.not.found=User not found, ID: {0} - 可选 messages.properties 作兜底(不推荐长期依赖)
文件名必须以 messages 开头,Spring Boot 默认识别该前缀;目录路径需与后续配置一致。
启用并配置 MessageSource
两种方式任选其一,推荐用 application.yml 配置(简洁且无需写 Java 类):
spring:
messages:
basename: i18n/messages
encoding: UTF-8
fallback-to-system-locale: false
use-code-as-default-message: true
这样 Spring 就会自动装配 ResourceBundleMessageSource,根据请求语言自动匹配对应 properties 文件。
从请求中提取语言环境
默认使用 Accept-Language 请求头解析语言(如 zh-CN,en-US;q=0.9),无需额外配置。若需支持 lang=zh-CN 这类自定义参数,可加一个 LocaleResolver Bean:
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
resolver.setDefaultLocale(Locale.CHINA);
return resolver;
}
它会在异常处理器中被自动注入,用于获取当前请求的 Locale。
在全局异常处理器中动态翻译
用 @RestControllerAdvice 拦截异常,在处理方法里调用 MessageSource.getMessage():
@ExceptionHandler(BusinessException.class)
public ResponseEntity<ApiResult> handleBusinessException(
BusinessException e,
HttpServletRequest request) {
Locale locale = RequestContextUtils.getLocale(request); // 或从 LocaleResolver 获取
String message = messageSource.getMessage(
e.getCode(), // 如 "error.user.not.found"
e.getArgs(), // 如 new Object[]{userId}
locale
);
ApiResult result = ApiResult.fail(e.getCode(), message);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
}
注意:确保你的自定义异常(如 BusinessException)携带了可查的错误码(key)和可替换参数(args),这样才能精准匹配并填充国际化文案。
整个链路清晰稳定:请求带语言标识 → Spring 解析出 Locale → 异常处理器查 MessageSource → 返回对应语言的格式化提示。不依赖前端传参逻辑,也不侵入业务代码。


















