Spring Boot :Type Safe Configuration Properties

Subscribe to my newsletter and never miss my upcoming articles

property to be read from yaml or properties file. The number of variable we will be declaring would be way too many.
This problem looks more ugly in case if we require similar kind (read group) of properties. For example in case of properties related to Database or Security related configurations. Below is such a example :

# application.properties
#For using @ConfigurationProperties
application.name=User Application
application.version=1.0.0
application.description = ${app.name} - ${app.version} is an application to store user details
.application.security.enabled=true
application.security.user=admin
application.security.email= 
application.security.roles[0]=USER
application.security.roles[1]=ADMIN

Here if we try to read variables , tough all variables are related to app(which is at top level of hierarchy ), we will end up creating many variable to read each property from YAML , this might even make our class look ugly if number of properties increases significantly.
Spring provides a simple way to help us. We can create a class and bind all the properties from configuration files like YAML or properties . We can create a class with

@ConfigurationProperties
For above configuration let’s create a class and verify that it works.


@ConfigurationProperties(prefix = "application")
@Component
public class AppConfig {
private String name;
private String version;
private String description;
private Security security;
//getters and setters
}

We can create a security class and use it inside AppSecurity , values corresponding to app.security will be set inside it.

Security.java

public class Security {
private String user;
private String email;
private String [] roles;
//getters and setters
}

Now let’s autowire AppConfig class in our CommonController and create a request mapping to see that it works.

Inside CommonController.java

Add a Autowired variable for AppConfig


@Autowired
private AppConfig appConfig;

And then add a request mapping which returns AppConfig. If bindings are correct ,it will return all the values.


@RequestMapping("app-config")
protected AppConfig appConfig(){
return appConfig;
}

Once done , lets verify if the entire code is working well . Just hit URL : http://localhost:8081/v1/app-config
You should be getting following response.


{
"name": "User Application",
"version": "1.0.0",
"description": "User Application - 1.0.0 is an application to store user details",
"security": {
"user": "admin",
"email": "",
"roles": [
"USER",
"ADMIN"
]
}
}

This shows how easily we can have a type safe and less verbose property file reading using , @ConfigurationProperties.

No Comments Yet