Spring PropertySourcesPlaceholderConfigurer does not use custom PropertySource for @Value

java, spring, spring-test

Solution

To get value from property source with `@Value` you have to use `${}` syntax:

@Autowired
public void setFoo(@Value("${test}")String value){
    foo=value;
}

Take a look at official documentation.

Problem

I have been trying to get a very basic example of a custom PropertySource running in a Spring Application. This is my PropertySource: ``` public class RemotePropertySource extends PropertySource{ public RemotePropertySource(String name, Object source) { super(name, source); } public RemotePropertySource(String name) { super(name); } public Object getProperty(String s) { return "foo"+s; } } ``` It gets added to the ApplicationContext via an ApplicationContextInitializer: ``` public class RemotePropertyApplicationContextInitializer implements ApplicationContextInitializer<GenericApplicationContext> { public void initialize(GenericApplicationContext ctx) { RemotePropertySource remotePropertySource = new RemotePropertySource("remote"); ctx.getEnvironment().getPropertySources().addFirst(remotePropertySource); System.out.println("Initializer registered PropertySource"); } } ``` Now I created a simple Unit-Test to see if the PropertySource is used correctly: ``` @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = RemotePropertySourceTest.ContextConfig.class, initializers = RemotePropertyApplicationContextInitializer.class) public class RemotePropertySourceTest { @Autowired private UnderTest underTest; @Autowired Environment env; @Test public void testContext() { assertEquals(env.getProperty("bar"),"foobar"); assertEquals(underTest.getFoo(),"footest"); } @Component protected static class UnderTest { private String foo; @Autowired public void setFoo(@Value("test")String value){ foo=value; } public String getFoo(){ return foo; } } @Configuration @ComponentScan(basePackages = {"test.property"}) protected static class ContextConfig { @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigurer() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); return configurer; } } } ``` Accessing the value via the Environment gives me the correct result ("foobar"), but using the @Value-Annotation fails. As far as I have read in the documentation the PropertySourcesPlaceholderConfigurer in my Configuration should automatically pick up my PropertySource from the environment but apparently it does not. Is there something I am missing? I know that accessing properties explicitly via the environment is preferrable but the existing application uses @Value-Annotations a lot. Any help is greatly appreciated. Thanks!

Original source