Spring Boot - inject map from application.yml


I have a Spring Boot application with the following application.yml - taken basically from here:

      artifact: ${project.artifactId}
      name: ${project.name}
      description: ${project.description}
      version: ${project.version}

I can inject particular values, e.g.

@Value("${info.build.artifact}") String value

I would like, however, to inject the whole map, i.e. something like this:

@Value("${info}") Map<String, Object> info

Is that (or something similar) possible? Obviously, I can load yaml directly, but was wondering if there's something already supported by Spring.

This question is tagged with java spring spring-boot

~ Asked on 2014-07-23 17:35:38

The Best Answer is


You can have a map injected using @ConfigurationProperties:

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

public class MapBindingSample {

    public static void main(String[] args) throws Exception {
        System.out.println(SpringApplication.run(MapBindingSample.class, args)

    public Test test() {
        return new Test();

    public static class Test {

        private Map<String, Object> info = new HashMap<String, Object>();

        public Map<String, Object> getInfo() {
            return this.info;

Running this with the yaml in the question produces:

{build={artifact=${project.artifactId}, version=${project.version}, name=${project.name}, description=${project.description}}}

There are various options for setting a prefix, controlling how missing properties are handled, etc. See the javadoc for more information.

~ Answered on 2014-07-23 21:27:22


Below solution is a shorthand for @Andy Wilkinson's solution, except that it doesn't have to use a separate class or on a @Bean annotated method.


  name: raja
  age: 12
    abcd: 1 
    bcbd: 2
    cdbd: 3


@ConfigurationProperties(prefix = "input")
class SomeComponent {

    private String name;

    private Integer age;

    private HashMap<String, Integer> somedata;

    public HashMap<String, Integer> getSomedata() {
        return somedata;

    public void setSomedata(HashMap<String, Integer> somedata) {
        this.somedata = somedata;


We can club both @Value annotation and @ConfigurationProperties, no issues. But getters and setters are important and @EnableConfigurationProperties is must to have the @ConfigurationProperties to work.

I tried this idea from groovy solution provided by @Szymon Stepniak, thought it will be useful for someone.

~ Answered on 2015-05-29 22:52:46

Most Viewed Questions: