I ran into this for property substitution in spring
but u
We use these three features as follows:
We declare two property files:
classpath:esb-project-config.properties,
classpath:esb-project-config-override.properties
The first property file contains sensible defaults and development configuration. This file is part of your application.
The second property file is a file that is available on the test classpath or even the production classpath of the application server. This file is external of the application That way we can override properties for each environment and have just one version of our application.
So here is the example of the properties we use:
<context:property-placeholder
ignore-resource-not-found="true" ignore-unresolvable="true"
location="classpath:esb-project-config.properties,classpath:esb-project-config-override.properties" />
My preferred method, as added by spring 3.1, is as follows:
In your *-context.xml:
<context:property-placeholder location="classpath:/web-${spring.profiles.active}.properties" />
and in web.xml:
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>prod</param-value>
</context-param>
You can then specify the environment at runtime, for example:
mvn -Dspring.profiles.active=dev jetty:run
Or however you pass arguments to your container.
several approaches:
in src/main/resources/your-conf.xml
<context:property-placeholder
location="classpath:esb-project-config.properties"
order="1"/>
in src/test/resources/your-test-config.xml
<context:property-placeholder
location="classpath:esb-project-config.properties"
order="0"/>
If you running your test with src/test/resources
as a test classpath, the above will ensure to override src/main/resources/esb-project-config.properties
with the src/test/resources/esb-project-config.properties
.
This will override the whole property-placeholder
though, so you would have to provide all the properties needed in your application in for this test property-placeholder
. e.g.
<context:property-placeholder
location="classpath:esb-project-config.properties,
classpath:some-other-props-if-needed.properties"
order="0"/>
<context:property-override
location="classpath:esb-project-config.test.properties"/>
to override certain individual properties. Some examples here
You can use a prefix to control environment specific properties, this can be done by using system variables:
<context:property-placeholder
location="${ENV_SYSTEM:dev}/esb-project-config.properties"/>
In this case it will always look under:
<context:property-placeholder
location="dev/esb-project-config.properties"/>
by default, unless a ENV_SYSTEM
system variable is set. If it is set to qa
, for example, it will automatically look under:
<context:property-placeholder
location="qa/esb-project-config.properties"/>
Another approach is to make beans profile specific. For example:
<beans profile="dev">
<context:property-placeholder
location="esb-project-config.dev.properties"/>
</beans>
<beans profile="qa">
<context:property-placeholder
location="esb-project-config.qa.properties"/>
</beans>
The appropriate esb-project-config
will loaded depending on a profile set. For example this will load esb-project-config.dev.properties
:
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles( "dev" );
ctx.load( "classpath:/org/boom/bang/config/xml/*-config.xml" );
ctx.refresh();
Put the property-placeholder configuration in an extra spring xml configuration file.
For example:
applicationContext.xml
-- for the normal configration without any property-placeholder configurationapplicationContext-config.xml
-- contains only a property-placeholder that load the production config file.testApplicationContext.xml
. This file include
s the applicationContext.xml
and uses a property-placeholder with an other properties file.In a Web App you could load all production spring context files with this pattern applicationContext*.xml
.
For the tests you need only to load testApplicationContext.xml
this will include the normal config, but with other properties.
It seems:
<beans profile="dev">
<context:property-placeholder location="classpath:config/dev.properties"/>
</beans>
<beans profile="prod">
<context:property-placeholder location="classpath:config/prod.properties"/>
</beans>
It doesn't work. But you can do:
<context:property-placeholder location="classpath:config_${spring.profiles.active}.properties" />