关键是要将错误信息作为可配置的租户资源管理,后端提供GET /tenant/{tenantId}/error-messages接口返回定制提示,前端按租户上下文动态加载并兜底,默认文案降级使用i18n资源包。

要让多租户系统在出错时返回符合租户风格的提示信息,关键不是统一写死错误文案,而是把“错误信息”本身也当作可配置的租户资源来管理。这需要后端提供可被租户覆盖的错误码映射接口,并在前端按租户上下文动态加载对应提示。
定义租户级错误码映射接口
后端需暴露一个标准接口,如 GET /tenant/{tenantId}/error-messages,返回当前租户定制的错误提示配置。结构示例如下:
-
code:标准错误码(如
VALIDATION_FAILED、RESOURCE_NOT_FOUND) - message:该租户希望展示的中文提示(如 “表单填写不完整,请检查必填项”)
- level:提示级别(info/warn/error)
- supportUrl:可选,指向该租户专属的帮助文档链接
该接口应支持缓存(如 5 分钟 TTL),并由租户管理员在控制台中维护,无需发版即可生效。
前端按租户上下文动态加载与兜底
前端在登录成功或首次请求后,立即调用上述接口获取当前租户的错误映射表,并存入运行时状态(如 Pinia store 或 React Context)。后续所有 API 错误处理逻辑都基于此表渲染提示:
- 若响应含
error.code,优先查租户映射表;命中则展示定制文案 - 未命中时,降级使用平台默认文案(如从 i18n 资源包读取
error.VALIDATION_FAILED) - 对网络异常、超时等非业务错误,仍走全局兜底策略,不依赖租户配置
注意:该映射表应在租户切换(如 SSO 登录跳转、子域名变更)时主动刷新,避免跨租户提示混淆。
后端错误拦截器注入租户标识
为确保错误响应能被前端准确识别和匹配,后端需在全局异常处理器中显式携带租户上下文:
- 所有 JSON 错误响应统一包含
tenantId字段(即使只是透传请求头中的值) - 在 Spring Boot 中,可通过
@ControllerAdvice拦截异常,在ResponseEntitybody 中注入该字段 - 配合
TenantContextHolder.getTenantId()获取当前线程绑定的租户 ID,避免从原始请求重复解析
这样前端即使未预加载映射表,也能根据响应中的 tenantId + code 组合发起精准查询,提升首次错误提示的准确性。
支持灰度与回滚的提示管理机制
租户定制提示属于体验层配置,需具备发布控制能力:
- 后台提供“草稿态”与“已发布”两版本,管理员可编辑后预览,确认无误再发布
- 每次发布生成版本号(如 v2.1),前端请求时可带
?v=2.1强制拉取指定版本,便于问题定位 - 支持一键回滚至上一版本,应对上线后发现措辞不当或翻译错误等情况
该机制让提示文案演进变得可控,不依赖代码发布,真正实现“运营可管、租户可用、故障可逆”。

















