Spring changing the properties file in runtime
Solution 1
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.
Solution 2
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 browserOutput : 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/OPTIONSCall
localhost:XXXX/find
from your browserOutput : abc
Solution 3
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.
Avi Elgal
Updated on June 16, 2022Comments
-
Avi Elgal almost 2 years
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
-
Khwaja Sanjari over 5 yearsWhat if we change the encrypted password in runtime? Do we need to restart the app?
-
amdg over 5 yearsIf you are changing the password in the properties file at runtime,a restart is required. As specified in the answer, the properties file is loaded & read only once, when the application starts up.