Quite a common use case when developing a Spring application is that you want to have multiple versions of configuration properties depending on where you are deploying to, for example, database URLs or feature flag may be environment specific on dev, qa, production etc.
Like most Spring development tasks, there are several way to solve the problem. My preference is based on the following assumptions and preferences:
- We create a default configuration properties file (e.g. ‘appConfig.properties’) and package this within the deployable artifact (JAR or WAR etc)
- This file will contain a sensible set of default ‘baseline’ properties that the application requires to run successfully
- This default configuration file will typically be used for development purposes i.e. the appConfig.properties included within the application code will allow the application to work ‘out of the box’ on a well configured local development box
- We are using Maven to package our application, and therefore we place the appConfig.properties file in the root level of the src/main/resources directory – this doesn’t mean you have to use Maven, but you will have to ensure that your application packaging process includes the properties files in a location that is on the classpath
- We want to override properties in the baseline appConfig.properties file via an external file located in the deployed application’s working directory
- We typically name this file appConfigOverride.properties
- We may not override all of the default properties, and therefore we want any properties not present in the override file to default to the values in the baseline appConfig.properties file
- It is possible to override application properties by passing parameters on the Command Line when executing the application, or setting system variables, but this is a separate topic
We use the following structure for our application-context.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="file:appConfigOverride.properties" order="-1" ignore-unresolvable="true" ignore-resource-not-found="true" /> <context:property-placeholder location="classpath:appConfig.properties" /> .... </beans>
The key things here, are the ‘order’ attribute, which forces properties found in the appConfigOverride.properties to be used when a property is also found in another file (effectively overriding values from the other file), and the ‘ignore-unresolvable=”true” ignore-resource-not-found=”true”‘ which allows Spring to continue loading the context if it can’t find the external file (or it doesn’t contain override all of the default properties from the appConfig file)
Java Platform, Enterprise Edition is a widely used platform for enterprise server programming in the Java programming language.
This book covers exciting recipes on securing, tuning and extending enterprise applications using a Java EE 6 implementation.The book starts with the essential changes in Java EE 6. Then they will dive into the implementation of some of the new features of the JPA 2.0 specification, and look at implementing auditing for relational data stores.They will then look into how they can enable security for their software system using Java EE built-in features as well as using the well-known Spring Security framework. They will then look at recipes on testing various Java EE technologies including JPA, EJB, JSF, and Web services.Next they will explore various ways to extend a Java EE environment with the use of additional dynamic languages as well as frameworks.At the end of the book, they will cover managing enterprise application deployment and configuration, and recipes that will help you debug problems and enhance the performance of your applications.