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();
- }
- }