Search code examples
springspring-bootyamlsnakeyaml

Spring boot configuration problem with YAML files


I have the following yaml file

    proj:
     sms:
      gateway:
        username: d
        password: erer
        signature: e
        url: http://link.somelink.com
      actionKeyMap:
       OTP_GENERATOR: Value1
       CREATE_USER: Value2

I'm trying to bind the actionKeyMap/gateway property into a Java map and it doesn't works.

I've tried the following code

@Component
@ConfigurationProperties(prefix="proj.sms")
public class MessageResolver {

    //@Value("${proj.sms.actionKeyMap}")
    private Map<String, String> actionKeyMap;

ConfigurationProperties or Value annotation doesn't works.


Solution

  • Adding code as discussed in comments

    Application.yml

    proj:
      sms:
        gateway:
            username: d
            password: erer
            signature: e
            url: http://link.somelink.com
        actionKeyMap:
          OTP_GENERATOR: Value1
          CREATE_USER: Value2
    

    Spring boot Application.java

    package hello;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    //@EnableConfigurationProperties
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
    
        }
    }
    

    MessageResolver.java

    package hello;
    
    import java.util.Map;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    @Component
    @ConfigurationProperties(prefix="proj.sms")
    public class MessageResolver {
    
        //@Value("${proj.sms.actionKeyMap}")
        private Map<String, String> actionKeyMap;
    
        @Value("${proj.sms.actionKeyMap.OTP_GENERATOR}")
        private String test;
    
        public String getTest() {
            return test;
        }
    
        public void setTest(String test) {
            this.test = test;
        }
    
        public Map<String, String> getActionKeyMap() {
            return actionKeyMap;
        }
    
        public void setActionKeyMap(Map<String, String> actionKeyMap) {
            this.actionKeyMap = actionKeyMap;
        }
    
    }
    

    GreetingController.java

    package hello;
    
    import java.util.concurrent.atomic.AtomicLong;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        private static final String template = "Hello, %s!";
        private final AtomicLong counter = new AtomicLong();
    
        @Autowired
        MessageResolver messageResolver;
    
        @RequestMapping("/greeting")
        public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
    
            System.out.println(messageResolver.getTest());
            System.out.println(messageResolver.getActionKeyMap());
            return new Greeting(counter.incrementAndGet(),
                                String.format(template, name));
        }
    }
    

    Greeting.java (in case you try to build complete project)

    package hello;
    
    public class Greeting {
    
        private final long id;
        private final String content;
    
        public Greeting(long id, String content) {
            this.id = id;
            this.content = content;
        }
    
        public long getId() {
            return id;
        }
    
        public String getContent() {
            return content;
        }
    }
    

    URL http://localhost:8080/greeting

    Console Output from GreetingController (sop on line 22 & 23)

    Value1
    {OTP_GENERATOR=Value1, CREATE_USER=Value2}