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配置:如果手动声明了
MessageSourceBean,确认是否设置了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
相关产品推荐
相关产品推荐

