Spring Boot: read list from yaml using @Value or @

2019-02-06 18:27发布

I want to read a list of hosts from a yaml file (application.yml), the file looks like this:

cors:
    hosts:
        allow: 
            - http://foo1/
            - http://foo2/
            - http://foo3/

(Example 1)

My class used defines the value like this:

@Value("${cors.hosts.allow}")   
List<String> allowedHosts;

But reading fails as Spring complains about this:

java.lang.IllegalArgumentException: Could not resolve placeholder 'cors.hosts.allow' in string value "${cors.hosts.allow}"

When I change the file like this the property can be read but naturally it does not contain the list but only one entry:

cors:
    hosts:
        allow: http://foo1, http://foo2, http://foo3

(I know that I could read the values as a single line and split them by "," but I do not want to go for a workaround yet)

This does not work either (although I think this should be valid according to snakeyamls docs):

cors:
    hosts:
        allow: !!seq [ "http://foo1", "http://foo2" ] 

(Skipping the !!seq and just using the [ / ] is a failure too)

I read the suggestion here which involves using @ConfigurationProperties and transferred the example to Java and used it with the yaml file you see in Example1:

@Configuration
@EnableWebMvc
@ConfigurationProperties(prefix = "cors.hosts")
public class CorsConfiguration extends WebMvcConfigurerAdapter {
    @NotNull
    public List<String> allow;
...

When I run this I get this complaint:

org.springframework.validation.BindException: org.springframework.boot.bind.RelaxedDataBinder$RelaxedBeanPropertyBindingResult: 1 errors Field error in object 'cors.hosts' on field 'allow': rejected value [null]; codes [NotNull.cors.hosts.allow,NotNull.allow,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [cors.hosts.allow,allow]; argumen ts []; default message [allow]];

I searched for other means to have my CORS hosts configurable and found this Spring Boot issue but as this is not yet finished I can't use it as a solution. All of this is done with Spring Boot 1.3 RC1

3条回答
老娘就宠你
2楼-- · 2019-02-06 19:01

I have been able to read list from properties like below way-

Properties-

cors.hosts.allow[0]=host-0
cors.hosts.allow[1]=host-1

Read property-

@ConfigurationProperties("cors.hosts")
public class ReadProperties {
    private List<String> allow;

    public List<String> getAllow() {
       return allow;
    }
    public void setAllow(List<String> allow) {
        this.allow = allow;
    }
}
查看更多
\"骚年 ilove
3楼-- · 2019-02-06 19:05

It's easy, the answer is in this doc and also in this one

So, you have a yaml like this:

cors:
    hosts:
        allow: 
            - http://foo1/
            - http://foo2/
            - http://foo3/

Then you first bind the data

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@ConfigurationProperties(prefix="cors.hosts")
public class AllowedHosts {
    private List<String> HostNames; //You can also bind more type-safe objects
}

Then in another component you just do

@Autowired
private AllowedHosts allowedHosts;

And you are done!

查看更多
时光不老,我们不散
4楼-- · 2019-02-06 19:18

use comma separated values in application.yml

corsHostsAllow: http://foo1/, http://foo2/, http://foo3/

java code for access

@Value("${corsHostsAllow}")    
String[] corsHostsAllow

I tried and succeeded ;)

查看更多
登录 后发表回答