多语言全局异常响应结构的核心是将错误提示信息改为动态加载的国际化资源,仅message字段可翻译,code、data等字段保持不变;错误码通过枚举绑定国际化key,由messagesource根据locale解析对应文案,支持请求头、url参数或cookie获取语言环境,并统一处理@valid校验错误。

多语言版本的全局异常响应结构,核心是把错误提示信息从硬编码字符串变成可动态加载的国际化资源,同时保持响应体结构稳定、错误码清晰、前端能按需切换语言。
响应体结构要保留固定字段,只让 message 可翻译
统一响应类(如 Result
- code:整型错误码(如 1001),对应枚举类中的唯一标识,不随语言变化
- message:运行时根据当前语言环境(Locale)从 properties 文件中查出的本地化文案
- timestamp、requestId 等辅助字段可选添加,也不参与翻译
错误码必须用枚举+国际化资源绑定
避免在代码里写死中文或英文文案,所有业务错误都通过枚举定义,每个枚举项关联一个国际化的 key。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义 ErrorCode 接口,声明 getCode() 和 getMessageKey()
- 按模块建枚举类,例如 UserErrorCode.USER_NOT_FOUND("user.not.found")
- 在 messages_zh_CN.properties 中写:user.not.found=用户不存在
- 在 messages_en_US.properties 中写:user.not.found=User not found
- 异常处理器中调用 MessageSource.getMessage(enum.getMessageKey(), null, locale) 获取实际文案
异常处理器里要获取并传递当前 Locale
@RestControllerAdvice 默认不感知请求语言,需要主动提取。常见方式有三种:
- 从请求头读取 Accept-Language,用 LocaleResolver 解析成 Locale 对象
- 支持 URL 参数(如 ?lang=en)或 Cookie 存储语言偏好,自定义 LocaleContextResolver
- 在 @ExceptionHandler 方法参数中直接声明 Locale locale,Spring 会自动注入当前请求的语言上下文
- 确保 MessageSource Bean 已配置为 ReloadableResourceBundleMessageSource,支持热更新和默认 fallback
参数校验错误也要走同一套翻译链路
Spring 的 @Valid 校验失败抛出 MethodArgumentNotValidException,其错误信息默认是英文。要让它也支持多语言,关键在两点:
- 校验注解的 message 属性必须写成 key 形式,例如 @NotBlank(message = "user.name.not.blank")
- 在全局异常处理器中,用 BindingResult 获取 FieldError,再逐个调用 messageSource.getMessage(error, locale) 拼接最终提示
- 建议封装一个工具方法统一处理字段级错误,避免重复逻辑










