关键是将错误类型与文案分离:异常仅携带错误码和参数,多语言文案由资源文件按语言环境动态渲染;定义i18n键名枚举,配多语言properties文件,通过messagesource解析占位符并兜底,默认英文不崩不空。

Java 自定义异常结合国际化文案动态输出,关键是把“错误类型”和“错误说法”彻底分开:异常只负责携带错误码和参数,真正的多语言文案交给外部资源文件,运行时按当前语言环境实时查表渲染。
定义带 i18n key 的错误枚举
枚举不存具体文字,只管唯一编码、i18n 键名和可选参数说明:
- 每个项包含 code(如 USER_NOT_FOUND)、key(如 "error.user.not.found")和默认英文兜底消息
- key 必须与 .properties 文件中的键严格一致,作为连接异常和文案的桥梁
- 避免在枚举里写中文或英文句子,保持纯配置语义
准备多语言资源文件
在 src/main/resources/i18n/ 下放标准命名的 UTF-8 编码 properties 文件:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- messages_zh_CN.properties:error.user.not.found=用户 {0} 不存在
- messages_en_US.properties:error.user.not.found=User {0} not found
- messages_ja_JP.properties:error.user.not.found={0} ユーザーが存在しません
- 占位符统一用 {0}、{1},与 MessageFormat 兼容
封装支持本地化的自定义异常
异常类持有枚举项,构造时不拼文案,而是委托 MessageSource 解析:
- 继承 RuntimeException(业务异常通常非受检)
- 构造函数接收枚举实例(如 ErrorCode.USER_NOT_FOUND)和参数数组(如 new Object[]{"zhangsan"})
- 重写 getLocalizedMessage() 或自定义 getMessage():从 LocaleContextHolder.getLocale() 拿当前语言,调用 MessageSource.getMessage(key, args, locale)
- fallback 机制要健全——key 找不到时返回枚举里的默认英文,不崩也不空
在 Web 层统一响应带语言的消息
全局异常处理器(@ControllerAdvice)是最终渲染点:
- 捕获你的自定义异常(如 BusinessException)
- 不再直接返回 ex.getMessage(),而是再次调用 messageSource.getMessage(...),确保使用客户端真实偏好语言(来自 Accept-Language 头或登录态)
- 组装标准 JSON 响应:{"code": "USER_NOT_FOUND", "message": "用户张三不存在", "data": null}
- 前端直接展示 message 字段,无需二次翻译或判断语言
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










