Reputation: 149
I'm using Spring Boot and I have a properties file p.properties:
p1 = some val1
p2 = some val2
Configuration class:
@Configuration
@PropertySource("classpath:p.properties")
public class myProperties {
public myProperties () {
super();
}
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
And I'm using this in order to access the property:
@Value("${p1}")
private String mProperty;
Everything works great. I want to change p1 in p.properties file from outside of the app and the next time that I'll use mProperty, it will contains the new value without restarting the app. Is it possible?
Thanks, Avi
Upvotes: 6
Views: 17078
Reputation: 777
If you want to change the properties at runtime and don't want to restart the server then follow the below steps:
Application.properties
app.name= xyz
management.endpoints.web.exposure.include=*
Add below dependencies in pom.xml
org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-context 2.0.1.RELEASE3)Place application.properties in config folder . The config folder must be in the location from where you will run the jar.
Add ApplcationProperties.java
@RefreshScope @Component @ConfigurationProperties(prefix = "app") public class ApplcationProperties { private String name; //getter and setter }
Write ApplicationController.java and inject ApplcationProperties
@Autowired ApplcationProperties applcationProperties;
@RestController public Class ApplicationController { @GetMapping("/find") String getValue() { return applicationProperties.getName(); } }
Run the spring boot application
Call localhost:XXXX/find
from your browser
Output : xyz
Change the value in application.properties from xyz to abc
Using postman send a put /options request to localhost:XXXX/actuator/refresh
--Note this request should be either PUT/OPTIONS
Call localhost:XXXX/find
from your browser
Output : abc
Upvotes: 2
Reputation: 3807
You can simply use spring boot actuator
.
Just add the actuator dependency in your maven/gradle config
and you should be seeing live reloads when you update the property
file.
Note: You won't have to restart the app but actuator will do live reloads
on its own.
Upvotes: 6
Reputation: 2239
I think, in this case, it is advisable to keep it in the database so that, it can be changed & accessed seamlessly. We have a similar scenario where we keep the encrypted password for database in the properties file. While connecting to db, it needs to be decrypted. We do that by extending PropertyPlaceholderConfigurer
as follows.
public class MyPropertyConfigurer extends PropertyPlaceholderConfigurer{
protected void convertProperties(Properties props){
Enumeration<?> propertyNames = props.propertyNames();
while (propertyNames.hasMoreElements()) {
String propertyName = (String) propertyNames.nextElement();
String propertyValue = props.getProperty(propertyName);
if(propertyName.indexOf("db.password") != -1){
decryptAndSetPropValue(props,propertyName,propertyValue);
}
}
}
}
But, this is done only once while loading the properties file.
Upvotes: 1