2016-11-07 261 views
2

我需要將Spring Boot應用程序的配置保存在數據庫中。Spring Boot:使用數據庫和application.properties進行配置

是否可以將數據庫信息存儲在application.properties中並使用它們連接到數據庫並從那裏檢索所有其他屬性?

所以我application.properties會是什麼樣子:

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=mydb 
spring.datasource.username=user 
spring.datasource.password=123456 
spring.jpa.database-platform=org.hibernate.dialect.SQLServer2012Dialect 

而其他配置會從數據庫的東西中獲取這樣的:

@Configuration 
@PropertySource(value = {"classpath:application.properties"}) 
public class ConfigurationPropertySource { 

    private final ConfigurationRepository configurationRepository; 

    @Autowired 
    public ConfigurationPropertySource(ConfigurationRepository configurationRepository) { 
     this.configurationRepository = configurationRepository; 
    } 

    public String getValue(String key) { 
     ApplicationConfiguration configuration = configurationRepository.findOne(key); 
     return configuration.getValue(); 
    } 

} 

隨着ApplicationConfigurationEntity

但是Spring Boot沒有從數據庫中獲取配置。

+0

你應該能夠從你寫的屬性文件中獲取數據庫配置。你在控制檯中看到任何錯誤嗎? – kuhajeyan

+0

我從'application.properties'獲取配置。我可以連接到數據庫並保存實體。但是數據庫中的屬性未加載。 – deve

+0

然後ConfigurationRepository做什麼? – kuhajeyan

回答

2

您可以鍛鍊的一種可能的解決方案是使用ConfigurableEnvironment並重新加載和添加屬性。

@Configuration 
public class ConfigurationPropertySource { 

private ConfigurableEnvironment env; 

private final ConfigurationRepository configurationRepository; 

    @Autowired 
    public ConfigurationPropertySource(ConfigurationRepository configurationRepository) { 
     this.configurationRepository = configurationRepository; 
    } 

    @Autowired 
    public void setConfigurableEnvironment(ConfigurableEnvironment env) { 

     this.env = env; 
    } 

    @PostConstruct 
    public void init() { 
    MutablePropertySources propertySources = env.getPropertySources(); 
     Map myMap = new HashMap(); 
     //from configurationRepository get values and fill mapp 
     propertySources.addFirst(new MapPropertySource("MY_MAP", myMap)); 
    } 

} 
+0

不幸的是,這並沒有奏效。該數據庫包含sql日誌記錄的配置屬性。但是當我向數據庫添加記錄時沒有顯示日誌,所以我想這些屬性不會被加載。 – deve

+1

@deve屬性已被加載,但在您的日誌記錄配置完成後。來自數據庫的那些屬性可用於配置Bean。雖然我更喜歡在'@ PostConstruct'中初始化它們,但在'DataSource'剛剛啓動後的自定義'BeanPostProcessor'中。 –

+0

@EugeneTo請舉個例子嗎? – deve

0

我遺憾的是沒有這個問題的解決辦法,但我用以下解決方法,現在(需要在配置改變額外的應用程序重新啓動)。

@Component 
public class ApplicationConfiguration { 

    @Autowired 
    private ConfigurationRepository configurationRepository; 

    @Autowired 
    private ResourceLoader resourceLoader; 

    @PostConstruct 
    protected void initialize() { 
     updateConfiguration(); 
    } 

    private void updateConfiguration() { 
     Properties properties = new Properties(); 

     List<Configuration> configurations = configurationRepository.findAll(); 
     configurations.forEach((configuration) -> { 
      properties.setProperty(configuration.getKey(), configuration.getValue()); 
     }); 

     Resource propertiesResource = resourceLoader.getResource("classpath:configuration.properties"); 
     try (OutputStream out = new BufferedOutputStream(new FileOutputStream(propertiesResource.getFile()))) { 
      properties.store(out, null); 
     } catch (IOException | ClassCastException | NullPointerException ex) { 
      // Handle error 
     } 
    } 

} 

我從數據庫加載配置並將其寫入另一個屬性文件。該文件可以與@PropertySource("classpath:configuration.properties")一起使用。

相關問題