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();
}
}
随着ApplicationConfiguration
为Entity
。
但是Spring Boot没有从数据库中获取配置。
答
您可以锻炼的一种可能的解决方案是使用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));
}
}
答
我遗憾的是没有这个问题的解决办法,但我用以下解决方法,现在(需要在配置改变额外的应用程序重新启动)。
@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")
一起使用。
你应该能够从你写的属性文件中获取数据库配置。你在控制台中看到任何错误吗? – kuhajeyan
我从'application.properties'获取配置。我可以连接到数据库并保存实体。但是数据库中的属性未加载。 – deve
然后ConfigurationRepository做什么? – kuhajeyan