Spring 3.2 @value annotation with pure java configuration does not work, but Environment.getProperty works

JavaSpring

Java Problem Overview


I've been breaking my head on this one. Not sure what I am missing. I am unable to get the @Value annotations to work in a pure java configured spring app(non web)

@Configuration
@PropertySource("classpath:app.properties")
public class Config {
	@Value("${my.prop}") 
	String name;
	
	@Autowired
	Environment env;
	
	@Bean(name = "myBean", initMethod = "print")
	public MyBean getMyBean(){
		 MyBean myBean = new MyBean();
		 myBean.setName(name);
		 System.out.println(env.getProperty("my.prop"));
		 return myBean;
	}
}

The property file just contains my.prop=avalue The bean is as follows:

public class MyBean {
	String name;
	public void print() {
		System.out.println("Name: " + name);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

The environment variable prints the value properly, the @Value does not.
avalue
Name: ${my.prop}

The main class just initializes the context.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

However if I use

@ImportResource("classpath:property-config.xml")

with this snippet

<context:property-placeholder location="app.properties" />

then it works fine. Of course now the enviroment returns null.

Java Solutions


Solution 1 - Java

Add the following bean declaration in your Config class

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
	return new PropertySourcesPlaceholderConfigurer();
}

In order for @Value annotations to work PropertySourcesPlaceholderConfigurer should be registered. It is done automatically when using <context:property-placeholder> in XML, but should be registered as a static @Bean when using @Configuration.

See @PropertySource documentation and this Spring Framework Jira issue.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAbeView Question on Stackoverflow
Solution 1 - JavadimchezView Answer on Stackoverflow