Spring Boot:使用数据库和application.properties进行配置

问题描述:

我需要将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

您可以锻炼的一种可能的解决方案是使用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

我遗憾的是没有这个问题的解决办法,但我用以下解决方法,现在(需要在配置改变额外的应用程序重新启动)。

@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")一起使用。