Spring Data REST枚举转换未回退到rest-messages的问题求助
看起来你已经搞定了业务messages的fallback问题,但Spring Data REST的rest-messages还在顽固地 fallback到系统locale(it-IT)对吧?这是因为Spring Data REST默认会使用它自己的MessageSource配置,而不是直接复用你自定义的那个——除非你明确告诉它要这么做。
下面是两步走的解决方案,适配你的Spring Boot 1.5.8版本:
1. 让自定义MessageSource接管rest-messages的加载
首先,你的自定义MessageSource目前只加载classpath:/i18n/messages开头的文件,而你的rest-messages.properties和rest-messages_it.properties大概率是放在classpath根目录(或其他独立位置),所以得把rest-messages的路径加入到basenames里,让你的MessageSource能接管这些文件的加载:
@Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); // 加入rest-messages的路径,根据你的实际存放位置调整 messageSource.setBasenames("classpath:/i18n/messages", "classpath:/rest-messages"); messageSource.setUseCodeAsDefaultMessage(false); messageSource.setCacheSeconds((int) TimeUnit.HOURS.toSeconds(1)); messageSource.setFallbackToSystemLocale(false); // 关键配置,保持不变 return messageSource; }
如果你的rest-messages是放在i18n目录下,就把路径改成classpath:/i18n/rest-messages。
2. 强制Spring Data REST使用你的自定义MessageSource
接下来,需要通过RepositoryRestConfigurerAdapter告诉Spring Data REST不要用它自己的默认MessageSource,而是用你配置的这个。创建一个配置类:
@Configuration public class SpringDataRestConfig extends RepositoryRestConfigurerAdapter { private final MessageSource customMessageSource; // 构造注入你自定义的MessageSource public SpringDataRestConfig(MessageSource customMessageSource) { this.customMessageSource = customMessageSource; } @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { // 把自定义MessageSource设置到Spring Data REST的配置中 config.setMessageSource(customMessageSource); } }
这样一来,Spring Data REST处理枚举翻译和自身消息时,就会使用你配置的MessageSource,遵循fallbackToSystemLocale=false的规则:当请求的Locale没有对应的rest-messages_{locale}.properties时,就会使用默认的rest-messages.properties,而不是 fallback到系统的it-IT版本。
额外检查点
- 确认你的
rest-messages.properties和rest-messages_it.properties的路径与basenames配置一致,避免Spring找不到文件而触发默认fallback行为。 - 测试时可以发送一个带有
Accept-Language: fr-FR的请求(假设没有rest-messages_fr.properties),验证返回的枚举翻译和REST消息是否来自默认的rest-messages.properties。
内容的提问来源于stack exchange,提问作者drenda

