问题
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
回答1:
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!
回答2:
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 ;)
回答3:
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;
}
}
回答4:
I met the same problem, But solved, give you my solution
exclude-url: >
/management/logout,
/management/user/login,
/partner/logout,
/partner/user/login
success in the version of Spring boot 2.1.6.RELEASE
来源:https://stackoverflow.com/questions/33369878/spring-boot-read-list-from-yaml-using-value-or-configurationproperties