springspring-properties

spring application.yml reference list from another property


I have property file application-dev.yml with content:

spring.profiles: dev
config.some.value:
- ELEMENT1
- ELEMENT2

and another application-staging.yml with content:

spring.profiles: staging
config.some.value:
- ELEMENT1
- ELEMENT2
- ELEMENT3

so I basically do not know size of list. When I reference this list in main application.yml like this:

some.value: ${config.some.value}

I get Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'value'. How to reference it correctly?


Solution

  • Solution

    One way would be to use comma-separated lists in your profiles:

    spring.profiles: dev
    config.some.value: ELEMENT1,ELEMENT2
    
    spring.profiles: staging
    config.some.value: ELEMENT1,ELEMENT2,ELEMENT3
    

    Then you should be able to access it in application.yml

    some.value: ${config.some.value}
    

    This solution doesn't require knowing list size upfront.

    Explanation

    The reason why this is working is described here. Specifically:

    YAML lists are represented as comma-separated values (useful for simple String values) and also as property keys with [index] dereferencers, for example this YAML:
    servers:
        - dev.bar.com
        - foo.bar.com
    Would be transformed into these properties:
    servers=dev.bar.com,foo.bar.com
    servers[0]=dev.bar.com
    servers[1]=foo.bar.com
    

    In particular this means, that if you specify comma-separated list of strings in application.yml and define List<String> as value in @ConfigurationProperties, spring configuration properties binder will convert that comma-separated list of string to List<Strings>.