I have a Spring application-context.xml with PropertyPlaceholderConfigurer to get properties’ values from .properties file. Main and test source folders have separate .properties file. The issue is that I need to use environment variables in .properties file. But when I do it in the following way:
property.name=${env.SYSTEM_PROPERTY}
I’m getting the following error:
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in class path resource [com/example/applicationContext.xml]: Could not resolve placeholder 'env.SYSTEM_PROPERTY'
while placeholder configurer defined as
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:com/example/application.properties"/>
</bean>
Any ideas how-to make property.name be interpreted as environment variable (and not as placeholder)?
Best regards, Dmitriy.
I’d probably change the solution completely: inject the system property directly, as opposed to injecting the property which refers to a system property
E.g.
or
I use a property placeholder configurer like this
You must also remember to pass the parameter into the program using
This way when you run the production version you can pass one thing and when you are running tests another.
Also what I often what I do is something like this:
where environment is prod/stage/test/int/ci/local (1 per environment – you may only have 2 or 3 for now). You can pass the environment variable to the program. Any properties which should be the same regardless of if its production/running on your local pc/tests would be in the someprops.properties property file. Any ones specific to the environment/way its being run as will go in the more specific file (you should put it in the someprops.properties file as well as a default unless overridden mechanism)
E.g.
in classpath:someprops.properties
in classpath:someprops-local.properties
By using this basic idea you can separate tests and the program’s normal running properties in a clean manner.