spring boot 多语言错误消息通过 messagesource 加载 i18n/messages_*.properties 文件,结合 localeresolver 与 localechangeinterceptor 支持请求头或 lang 参数动态切换语言,并在全局异常处理器中按 locale 解析提示文案。

在 Spring Boot 中实现多语言错误消息返回,核心是把“错误提示”从硬编码转为动态查表,再结合请求上下文的语言偏好(如请求头 X-App-Lang 或 Accept-Language)实时加载对应语言的文案。整个过程不依赖额外框架,Spring Boot 自带的 MessageSource 和异常处理机制就足够支撑。
准备多语言资源文件
在 src/main/resources 下新建 i18n/ 目录,放入标准命名的 .properties 文件:
-
i18n/messages.properties(默认兜底,建议用英文) -
i18n/messages_zh_CN.properties(简体中文) -
i18n/messages_en_US.properties(美式英文)
内容示例(messages_zh_CN.properties):
error.user.not.found=用户不存在,ID:{0}
error.param.required=参数 {0} 不能为空
error.system=系统繁忙,请稍后重试
注意:key 必须统一,值中用 {0}、{1} 占位,后续可传参替换。
配置 MessageSource 和基础参数
在 application.yml 中声明资源路径和编码:
spring:
messages:
basename: i18n/messages
encoding: UTF-8
fallback-to-system-locale: false
use-code-as-default-message: true
这样 Spring 就会自动加载 MessageSource Bean,并按需解析不同语言的文案。无需手动写 @Bean 配置——除非你需要自定义缓存或格式化逻辑。
让校验注解也支持多语言
Spring Boot 的 @Valid 校验(如 @NotBlank、@Min)默认读取 ValidationMessages.properties,但我们可以让它复用同一套 messages_*.properties:
- 在
messages_zh_CN.properties中添加校验提示,例如:NotBlank.userDto.name=姓名不能为空 - 确保
LocalValidatorFactoryBean绑定到你的MessageSource:
@Configuration
public class ValidationConfig {
@Bean
public LocalValidatorFactoryBean validator(MessageSource messageSource) {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource);
return bean;
}
}
之后实体类上写 @NotBlank(message = "NotBlank.userDto.name"),就能自动按语言返回对应提示。
全局异常处理器中动态取值
定义一个业务异常类,携带错误码和参数:
public class BusinessException extends RuntimeException {
private final String code;
private final Object[] args;
public BusinessException(String code, Object... args) {
super(code);
this.code = code;
this.args = args;
}
// getter 省略
}
在 @ControllerAdvice 中捕获并翻译:
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Result> handleBusinessException(BusinessException e, HttpServletRequest request) {
Locale locale = RequestContextUtils.getLocale(request); // 自动从请求头或拦截器获取
String msg = messageSource.getMessage(e.getCode(), e.getArgs(), locale);
return Result.fail(e.getCode(), msg);
}
关键点:不用自己解析 X-App-Lang,只要配好 LocaleResolver(见下一条),Spring 就能自动提供正确的 Locale。
支持前端主动切换语言
默认的 AcceptHeaderLocaleResolver 只看浏览器 Accept-Language,不够灵活。推荐加一个参数式切换器:
- 配置
SessionLocaleResolver或CookieLocaleResolver(保持用户偏好) - 注册
LocaleChangeInterceptor,监听lang参数:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
interceptor.setParamName("lang"); // 请求带 ?lang=zh_CN 即可切换
registry.addInterceptor(interceptor);
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver resolver = new SessionLocaleResolver();
resolver.setDefaultLocale(Locale.CHINA);
return resolver;
}
}
这样前端只需在请求 URL 加 ?lang=en_US,后续所有 messageSource.getMessage(...) 都会自动走英文文案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











