Spring Boot @ConfigurationProperties Tutorial

@ConfigurationProperties annotation is used to bind all the properties in a properties file to a Java class. You can then use an object of the Java class annotated with ConfigurationProperties annotation to access configuration properties defined in a properties file.

Earlier I shared with you a tutorial on how to read application properties in Spring Boot RESTful Web Service application. In this tutorial, you will learn how to map properties in a specific properties file to a Java object.

You might also be interested to learn how to bind nested properties.

Application Properties File

Let’s assume we have the following application.properties file.

database.name = photo_app
database.url = jdbc:mysql://localhost:3306/${database.name}
database.username = "developer"
database.password = "12345678"

Please note that each property starts with the prefix “database”. It can be any other prefix but having a prefix helps to map all the properties that start with “database” to a Java object much easier.

Let’s learn how to map these properties to a Java object.

Using @ConfigurationProperties

To map the above properties to a Java object, we must create a Java model class with class fields that match the property key.

In the above application.properties file, we have the following properties:

  • database.name,
  • database.url,
  • database.username,
  • database.password.

Each property has the prefix “database”. This prefix will need to be specified in a @ConfigurationProperties() annotation. Here is how to create a Java class:

@ConfigurationProperties("database")
public class DatabaseConfiguration {
    private String name;
    private String url;
    private String username;
    private String password;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
}

Now we can Autowire/Inject an object of this class into a Controller, for example, and be able to access values from the application properties file.

@RestController
@RequestMapping(path="/users")
public class UsersController {
 
    @Autowired
    DatabaseConfiguration databaseConfiguration;
    
    @GetMapping(path="/status/check")
    public String getStatus()
    {
        return " Working with database name " + databaseConfiguration.getName();
    }
}

Reading a Specific Properties File with @PropertySource

By default, @ConfigurationProperties will work with a default application.properties file in your Spring Boot Application. You can specify which configuration properties file to use by using a @PropertySource annotation. 

For example, let’s assume we have the following configuration properties defined in a properties file called dbconfig.properties.

database.name = photo_app
database.url = jdbc:mysql://localhost:3306/${database.name}
database.username = "developer"
database.password = "12345678"

We will create the following Java class to map properties stored in a dbconfig.properties file. Please notice how the @PropertySource annotation is used.

@PropertySource("classpath:dbconfig.properties")
@ConfigurationProperties("database")
public class DatabaseConfiguration {
    private String name;
    private String url;
    private String username;
    private String password;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
}

Validating Properties

When using @ConfigurationProperties, it is possible to validate the property’s value as it is being set. For example:

  • @NotEmpty – The annotated element must not be null or empty,
  • @Min(5) – The annotated element must be a number whose value must be higher or equal to the specified minimum,
  • @Max(50) – The annotated element must be a number whose value must be lower or equal to the specified maximum,
  • @Length(max = 8, min = 16) – Validate that the string is between min and max included,
  • @Pattern(regexp = “[a-z-A-Z]*”, message = “Username can not contain invalid characters”) – The annotated {@code CharSequence} must match the specified regular expression,
  • @Email – The string has to be a well-formed email address.

And here is an example of how you would use validation annotations in our class:

@PropertySource("classpath:dbconfig.properties")
@ConfigurationProperties("database")
public class DatabaseConfiguration {
    
    @Length(min=2, max=10)
    private String name;
    
    @NotEmpty
    private String url;
    
    @Length(min=5, max=10)
    @Pattern(regexp = "[a-z-A-Z]*", message = "Username can not contain invalid characters") 
    private String username;

    @Length(min=8, max=16)
    private String password;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
}

I hope this tutorial was helpful to you. If you are interested in learning more about Spring Boot, look at the below list of video courses. One of them might be exactly what you are looking for.


Leave a Reply

Your email address will not be published. Required fields are marked *