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
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>
.
MyProfile:
SomeValues:
- ELEMENT1
- ELEMENT2
-ELEMENT3
- ELEMENT4
---
MyProfile:
someValues:
- ELEMENT1
- ELEMENT2
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
public class YAMLConfig {
private List<String> SomeValues= new ArrayList<>();
// standard getters and setters
}
To Access properties
@Autowired
private YAMLConfig myConfig;
private List<String> SomeValues= myConfig.SomeValues();
This worked for me
You can make your own configuration class which sets the value to that property as you want.
Please, take a look a this example:
When using String arrays the first and only element CAN be joined by commas - the final result is the same as a list. Meaning that you can set your variable like this:
config.some.value: ELEMENT1, ELEMENT2, ELEMENT3
then, at your profile section, you can reference the configuration value as it were a normal string:
someValues: ${config.some.value}
(I fear,) You'd have to reference it like that:
application.yaml:
some.value:
-${config.some.value[0]}
-${config.some.value[1]}
-${config.some.value[2]}
...and I foresee problems, when there's no ${config.some.value[2]}
(list sizes are inconsistent .. -> solution approach: try to "dummy"/"noop").
Refs:
This is the best way to create .yml file with multiple values:
spring:
profiles: dev
config:
some:
values: ELEMENT1,ELEMENT2
When we are using .yml files, we recommend pulling apart each word. To read values use:
@Value("${spring.config.some.values}")
private String[] values;
I hope it helps you.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.