Avi Elgal
Avi Elgal

Reputation: 149

Spring changing the properties file in runtime

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

Answers (3)

Umesh Sanwal
Umesh Sanwal

Reputation: 777

If you want to change the properties at runtime and don't want to restart the server then follow the below steps:

  1. Application.properties

    app.name= xyz

    management.endpoints.web.exposure.include=*

  2. Add below dependencies in pom.xml

    org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-context 2.0.1.RELEASE

    3)Place application.properties in config folder . The config folder must be in the location from where you will run the jar.

  3. Add ApplcationProperties.java

    @RefreshScope @Component @ConfigurationProperties(prefix = "app") public class ApplcationProperties { private String name; //getter and setter }

  4. Write ApplicationController.java and inject ApplcationProperties

    @Autowired ApplcationProperties applcationProperties;

    @RestController public Class ApplicationController { @GetMapping("/find") String getValue() { return applicationProperties.getName(); } }

  5. Run the spring boot application

  6. Call localhost:XXXX/find from your browser

    Output : xyz

  7. Change the value in application.properties from xyz to abc

  8. Using postman send a put /options request to localhost:XXXX/actuator/refresh --Note this request should be either PUT/OPTIONS

  9. Call localhost:XXXX/find from your browser

    Output : abc

Upvotes: 2

Shanu Gupta
Shanu Gupta

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

amdg
amdg

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

Related Questions