我有一个春季启动应用程序,它使用国家/地区配置文件。配置文件的结构相同,但不同国家/地区的值不同。
我已在资源目录中为每个国家/地区创建了一个目录,并将该国家/地区的配置文件放在那里。
根据请求参数中传递的国家/地区代码,我想使用相应的配置文件。什么是弹簧启动惯用的方法(除了使用像snakeyaml手动加载yaml配置文件)?
由于
答案 0 :(得分:6)
您可以通过为MessageSource
,LocaleResolver
和LocaleChangeInterceptor
bean创建bean来实现,然后将LocaleChangeInterceptor
添加到InterceptorRegistry
,如下所示:
@Configuration
public class CountryConfig extends WebMvcConfigurerAdapter{
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:country-conf/country");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3600);
return messageSource;
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("country");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
然后在country-conf
文件夹中创建一个文件夹 - resources
。在此文件夹中创建将具有您的配置的属性文件。例如:
country.properties(默认)
country.name=United states
<强> country_fr.properties 强>
country.name=France
如果参数中未发送国家/地区,则 country.properties
是默认属性,如果您在参数中发送country=fr
,则会查找country_fr.properties
文件。
现在创建一个服务,该服务将根据国家/地区参数
从这些属性文件中获取价值@Service
public class CountryService {
@Autowired
private MessageSource messageSource;
public String getMessage(String code) {
Locale locale = LocaleContextHolder.getLocale();
return this.messageSource.getMessage(code, null, locale);
}
}
测试此autowire国家/地区服务
@Autowired
CountryService countryService;
然后调用getMessage方法
countryService.getMessage("country.name");
答案 1 :(得分:2)