Problem with spring @Value annotation.
Hi. Today I expirienced problem with @Value annotation in spring.
This annotation can be used to inject value from properties files in spring based applications.
I will show you a typical use case of this annotation, the problem I encountered and how I dealt with it.
foo.properties:
address=Warsaw
Foo.java:
package com.raphaelsolarski.value; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Component @PropertySource("classpath:foo.properties") public class Foo { @Value("${address}") private String address; public String getAddress() { return address; } }
FooTest.java:
package com.raphaelsolarski.value; import com.raphaelsolarski.value.config.Config; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = Config.class) public class FooTest { @Autowired private Foo foo; @Test public void shouldReturnPropertyValue() throws Exception { String actual = foo.getAddress(); String expected = "Warsaw"; Assert.assertEquals(expected, actual); } }
The test will fail with the following error:
org.junit.ComparisonFailure: Expected :Warsaw Actual :${address}
There is a simple solution. We have to declare a PropertySourcesPlaceholderConfigurer bean somewhere in spring configuration of our application.
Config.java
package com.raphaelsolarski.value.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration @ComponentScan("com.raphaelsolarski.value") public class Config { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }