Johannes Loepelmann
Johannes Loepelmann

Reputation: 205

Spring PropertySourcesPlaceholderConfigurer does not use custom PropertySource for @Value

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!

Upvotes: 4

Views: 878

Answers (1)

Ken Bekov
Ken Bekov

Reputation: 14015

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.

Upvotes: 3

Related Questions