全局异常处理中实现ErrorMessage多语言转换,关键是异常只携带错误码(code),文案交由MessageSource根据Locale从资源文件动态加载;配置spring.messages.basename等参数,定义自定义异常类封装key与args,在@ControllerAdvice中调用messageSource.getMessage完成翻译并组装响应。

在全局异常处理中实现 ErrorMessage 多语言转换,关键是把“错误是什么”和“错误怎么说”彻底分开:异常只携带可识别的错误码(code),文案交给资源文件,渲染时机放在统一出口——即 @ControllerAdvice 里用 MessageSource 动态查。
配置 MessageSource 加载多语言资源
Spring Boot 默认支持,只需在 application.yml 中声明:
-
spring.messages.basename: messages(对应messages.properties、messages_zh_CN.properties、messages_en_US.properties等) -
spring.messages.encoding: UTF-8(避免中文乱码) -
spring.messages.fallback-to-system-locale: false(禁用系统 locale 回退,强制走配置语言)
资源文件示例(src/main/resources/messages_zh_CN.properties):
error.user.not.found=用户 {0} 不存在
error.param.required={0} 是必填项
定义可携带错误码的自定义异常
异常本身不存文案,只持有一个 key 和可选参数:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
立即学习“Java免费学习笔记(深入)”;
- 构造时传入枚举项或字符串 key,比如
new BusinessException("error.user.not.found", "zhangsan") - 推荐用枚举封装 key + code + args 说明,增强类型安全和可读性
- 异常类内部不解析消息,留到处理器中统一处理,便于日志记录原始 key
在 @ControllerAdvice 中完成动态翻译
全局异常处理器捕获后,不再调用 e.getMessage(),而是委托 MessageSource 渲染:
- 从请求头(如
Accept-Language或自定义X-Lang)提取Locale - 调用
messageSource.getMessage(key, args, locale)获取本地化文案 - 若 key 未找到,
MessageSource自动回退到默认语言(如messages.properties)或抛出NoSuchMessageException,可加 try-catch 提供兜底提示 - 将翻译后的文案组装进标准响应体(如
{"code": "USER_NOT_FOUND", "message": "用户 zhangsan 不存在"})
确保语言上下文准确传递
Locale 不能靠猜,需明确来源并保障线程可见:
- Web 场景优先用
LocaleContextHolder.getLocale(),它已由 Spring 的LocaleChangeInterceptor或自动解析器填充 - 若用自定义 header(如
X-Lang: en-US),可在拦截器中提前设置:LocaleContextHolder.setLocale(locale) - 异步线程(如
@Async)需手动传递 Locale,否则会丢失

















