Spring Boot国际化fallback消息始终为英文,默认Locale配置不生效问题求助
问题根源
你遇到的问题是Spring Boot国际化资源的降级逻辑和LocaleResolver的默认区域配置独立导致的,两者作用场景完全不同:
- LocaleResolver中配置的默认Locale,仅作用于**请求未携带任何区域标识(比如没传lang参数)**的场景
- 资源文件缺失时的降级逻辑由MessageSource的
fallbackToSystemLocale参数控制,该参数默认值为true:当找不到请求对应区域的资源文件时,会先尝试匹配JVM运行环境的默认区域,若你服务器JVM默认区域为英文,就会命中message_en.properties,最后才会回退到根资源文件,这就是你传入lang=es返回英文文案的原因。
解决步骤
1. 配置文件方式修改(适配默认自动装配的MessageSource)
如果你没有自定义MessageSource Bean,直接在application.properties中添加如下配置即可:
spring.messages.fallback-to-system-locale=false
如果使用application.yml,配置如下:
spring: messages: fallback-to-system-locale: false
关闭该配置后,只要找不到请求对应区域的资源文件,就会直接回退到根message.properties的意大利语文案。
2. 自定义Bean方式修改(适配自定义MessageSource的场景)
如果你手动声明了MessageSource Bean,需要在Bean定义中显式关闭该开关:
@Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasename("message"); messageSource.setDefaultEncoding("UTF-8"); // 核心配置:关闭回退到系统默认区域的逻辑 messageSource.setFallbackToSystemLocale(false); return messageSource; }
效果验证
配置完成后即可符合预期:
- 携带
lang=en参数时,返回message_en.properties的英文文案 - 携带其他lang参数、或者未传lang参数时,统一返回
message.properties的意大利语文案
内容的提问来源于stack exchange,提问作者Cristiano Longo
相关产品推荐
相关产品推荐

