在spring boot中加载上下文配置

Vik*_*ikk 2 java spring spring-boot

我有一个春季启动应用程序,它使用国家明智的配置文件.配置文件的结构相同,但不同国家/地区的值不同.

我在资源目录中为每个国家/地区创建了一个目录,并将该国家/地区的配置文件放在那里.

根据请求参数中传递的国家/地区代码,我想使用相应的配置文件.什么是弹簧启动惯用的方法来实现这一点(除了使用像snakeyaml手动加载yaml配置文件)?

谢谢

Aji*_*man 6

您可以通过创建豆acheive MessageSource,LocaleResolverLocaleChangeInterceptorbean,然后加入LocaleChangeInterceptorInterceptorRegistry这样的:

@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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后创建一个文件夹- country-confresources文件夹中.在此文件夹中创建将具有您的配置的属性文件.例如:

country.properties(默认)

country.name=United states
Run Code Online (Sandbox Code Playgroud)

country_fr.properties

country.name=France
Run Code Online (Sandbox Code Playgroud)

country.properties如果参数中没有发送国家/地区是默认属性,如果您发送country=fr参数然后它将查找country_fr.properties文件.

现在创建一个服务,该服务将根据country参数从这些属性文件中获取值

@Service
public class CountryService {

    @Autowired
    private MessageSource messageSource;

    public String getMessage(String code) {
        Locale locale = LocaleContextHolder.getLocale();
        return this.messageSource.getMessage(code, null, locale);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试此autowire国家/地区服务

@Autowired
CountryService countryService;
Run Code Online (Sandbox Code Playgroud)

然后调用getMessage方法

countryService.getMessage("country.name");
Run Code Online (Sandbox Code Playgroud)