You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RESTful服务国际化问题:未匹配Locale未返回getMessage指定默认消息

问题原因

Spring MessageSource 存在内置的资源回退逻辑,你传入 getMessage 方法的默认消息参数,仅在所有层级的资源文件中都找不到对应key时才会生效。默认根路径下的 messages.properties 是全局兜底资源,优先级高于你手动传入的默认消息,所以当中文Locale无对应资源文件时,会直接返回messages.properties中的对应配置,而不是你指定的默认消息。

排查步骤
  • 确认messages.properties中是否存在good.morning.message这个key:只要根资源存在该key,无论传入的Locale有没有对应资源文件,都不会触发你传入的默认消息。
  • 检查MessageSource的fallback配置:Spring Boot默认spring.messages.fallback-to-system-locale为true,当指定Locale无对应资源时,会先回退到JVM默认Locale的资源文件,找不到再读取messages.properties,进一步降低了默认消息的触发概率。
  • 排查自定义MessageSource配置:如果手动声明了MessageSource Bean,确认是否设置了setUseCodeAsDefaultMessage为true,该配置会让key本身作为默认返回,优先级高于方法入参的默认消息。
解决方案

方案1:调整资源文件配置

删除messages.properties中的good.morning.message key,此时当传入未配置的Locale时,所有层级资源都找不到对应key,就会自动返回你指定的默认消息。
对应Spring Boot配置可补充:

# 禁用回退到JVM默认Locale,避免出现预期外的资源匹配
spring.messages.fallback-to-system-locale=false

方案2:接口层新增语言合法性校验

在业务层先判断传入的Locale是否为支持的语言,逻辑更可控,无需修改框架默认配置:

@GetMapping(path="/internationalized")
public String internationalized(@RequestHeader(name="Accept-Language",required=false) Locale locale ){
    // 定义当前项目支持的语言列表
    List<Locale> supportedLocales = List.of(Locale.FRENCH, new Locale("nl"));
    if (locale == null || !supportedLocales.contains(locale)) {
        return "Default Message";
    }
    return messageSource.getMessage("good.morning.message", null, locale);
}

内容的提问来源于stack exchange,提问作者Roshan Choudhary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:04