The Spring Framework offers many options to configure your applications. Most of these options, however depend on a fixed location for your properties file. Though having a fixed location offers a lot of convenience, sometimes this is not what you want.
For a reason project I investigated a method to allow early checking for the configuration. I found that Spring Framework offers a ApplicationContextInitializer that allows you to inject custom initialisation code early in the wiring of the context. This simple example shows how to set it based on a system property and check that the file is readable.
public class PropertiesInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> {
/**
* A logger instance used for logging messages.
*/
private static final Logger logger = LoggerFactory.getLogger(PropertiesInitializer.class);
private static final String CONFIG_PATH = "WEBCONFIG_LOCATION";
@Override
public void initialize(ConfigurableWebApplicationContext ctx) {
final String userLocation = System.getProperty(CONFIG_PATH);
if (userLocation != null) {
Path propertiesFile = Paths.get(userLocation);
if (propertiesFile.toFile().canRead()) {
final Properties userProperties = new Properties();
try (Reader propertiesReader = Files.newBufferedReader(propertiesFile, StandardCharsets.UTF_8)) {
userProperties.load(propertiesReader);
final PropertiesPropertySource ps = new PropertiesPropertySource("USER_PROPERTIES", userProperties);
ctx.getEnvironment().getPropertySources().addFirst(ps);
} catch (final IOException ex) {
logger.warn("Exception while reading the properties", ex);
}
} else {
logger.warn("The file {} does not exist.", userLocation);
}
} else {
logger.info("The Java system property {} was not set."
+ " You can set it to the location of a properties file to override the default configuration.",
CONFIG_PATH);
}
}
}
This technique however allows to do a lot more than that. For instance you could do extensive validation on your properties: are all properties set; are file locations valid; is the database readable; etc. The advantage of checking this yourself is that you can fail early with a clear error message instead of making the administrator go throw a long list of exceptions to find out what’s wrong.
The complete code for this example project can be found in my github repository: https://github.com/djvanenckevort/allthingsdigital/