Eric Wilson
Eric Wilson

Reputation: 59405

How to use environment variables with properties file in Spring context file

I am trying to read in a configuration file based on a system environment variable. My environment variable is FOO_ENV with value dev and dev.properties contains the properties bar.host and bar.port.

<context:property-placeholder /> 
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:${FOO_ENV}.properties"></property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

<bean id="myServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <constructor-arg type="String" value="http://${my.host}:${my.port}/" />
</bean>

When I deploy this in tomcat, I get the following error:

11:48:39.324 [localhost-startStop-14] ERROR o.s.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'myServer' defined in ServletContext resource [/WEB-INF/my-context.xml]: 
    Could not resolve placeholder 'my.host' in string value [http://${my.host}:${my.port}]
    at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]

By replacing $FOO_ENV with dev in the context file, I have determined that the properties file can be read correctly. By changing FOO_ENV to other names, I can show that Spring is reading the environment variable.

It seems that the element

<property name="ignoreUnresolvablePlaceholders" value="true" />

should allow Spring to ignore that ${my.host} is not an environment variable, but though I've tried it in various places, I still get the same error, which indicates that my.host is not found.

Upvotes: 1

Views: 10017

Answers (1)

Adam B
Adam B

Reputation: 1774

You actually have two PropertyPlaceHolderConfigurers defined here. One via the context namespace and one explicitly. Spring is probably picking the one created via the context namespace. You could either set 'ignore-unresolvable' on the context tag and remove your propertyConfigurer bean like so:

<context:property-placeholder ignore-unresolvable="true"/>

Or if you need more control over PropertyPlaceHolderConfigurer go the other way and remove the context:property-placeholder tag.

Upvotes: 3

Related Questions