2017-09-10 1 views
2

Ich habe eine Spring-Boot-App, die länderspezifische Konfigurationsdateien verwendet. Die Struktur der Konfigurationsdateien ist identisch, die Werte sind jedoch für verschiedene Länder unterschiedlich.Load contextual config im Spring Boot

Ich habe ein Verzeichnis für jedes Land im Ressourcenverzeichnis erstellt und dort die Konfigurationsdatei des Landes abgelegt.

Basierend auf dem in den Anfrageparametern übergebenen Ländercode möchte ich die entsprechende Konfigurationsdatei verwenden. Was ist der Spring Boot idiomatische Weg, um dies zu erreichen (abgesehen davon, dass man die yaml config Dateien manuell mit etwas wie snakeyaml lädt)?

Dank

Antwort

2

Sie Frühling @Profile für jedes Land verwenden können. Siehe examples und docs.

Federprofile bieten eine Möglichkeit, Teile Ihrer Anwendung zu trennen und sie nur in bestimmten Umgebungen verfügbar zu machen. Alle @Component oder @Configuration mit @Profile markiert werden zu begrenzen, wenn es geladen wird:

Sie Profil auf der Laufzeit hinzufügen:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
    ctx.getEnvironment().setActiveProfiles("za"); 
+0

Soweit ich es verstehe, müssen Sie Springboot mitteilen, welches Profil beim Start geladen werden soll (zB dev, s walking, prod etc.). In meinem Fall basiert die Anfrage z./getData? countryCode = za,/getData? countryCode = in etc und ich muss entsprechende Konfigurationsdateien (za/config.yaml und in/config.yaml) verwenden, um jede Anfrage zu bedienen. Verwenden Sie Profile dafür? – Vikk

+0

Sie können es programmatisch hinzufügen: 'AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.getEnvironment(). SetActiveProfiles ("za"); ' – user7294900

5

Sie können acheive von Bohne zu schaffen für MessageSource hinzufügen, LocaleResolver und LocaleChangeInterceptor Bohne und dann LocaleChangeInterceptor-InterceptorRegistry wie folgt aus:

@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()); 
     } 
    } 

Und dann erstellen Sie einen Ordner country-conf in resources Ordner. In diesem Ordner erstellen Sie eine Eigenschaftendatei, die Ihre Konfiguration hat. Ex:

country.properties (Standard)

country.name=United states 

country_fr.properties

country.name=France 

country.properties ist die Standardeigenschaften, wenn kein Land in Parameter gesendet wird, und wenn Sie country=fr schicken in Parameter wird dann nach country_fr.properties Datei suchen.

nun einen Dienst erstellen, die den Wert von diesen Eigenschaften erhalten wird auf Länderparameter

@Service 
public class CountryService { 

    @Autowired 
    private MessageSource messageSource; 

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

Um zu testen, um dieses autowire Land Service

@Autowired 
CountryService countryService; 

Und dann rufen getMessage Methode dateibasierte

countryService.getMessage("country.name"); 
Verwandte Themen