Spring Boot:使用@Value或@ConfigurationProperties从yaml读取列表

gj3fmq9x  于 2022-10-30  发布在  Spring
关注(0)|答案(5)|浏览(205)

我想从一个yaml文件(application.yml)中读取主机列表,该文件看起来像这样:

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

(例1)
我使用的类定义了如下值:

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

但是阅读失败了,因为Spring抱怨说:
异常错误:无法解析字符串值“${cors. hosts.allow}”中的占位符“cors. hosts.allow”
当我像这样修改文件时,属性可以被读取,但它自然不包含列表,而只包含一个条目:

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

(我知道我可以将这些值作为一行读取,然后按","拆分它们,但我还不想找到解决方法)
这也不起作用(尽管我认为根据snakeyamls docs,这应该是有效的):

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

(跳过!!seq而仅使用[/]也是失败的)
我阅读了建议here,其中涉及到使用@ConfigurationProperties,并将该示例转换为Java,并将其与示例1中的yaml文件一起使用:

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

当我运行此程序时,我收到以下投诉:
org.springframework.validation.BindException:绑定结果:对象'cors.hosts'中字段'allow'上的字段错误:拒绝的值[null];代码[非空.cors.主机.允许,非空.允许,非空];可解析的消息源:代码[cors.主机.允许,允许];论证ts [];默认消息[允许]];
我搜索了其他方法来配置我的CORS主机,并找到了这个Spring Boot issue,但由于它还没有完成,我不能将其作为一个解决方案。

niwlg2el

niwlg2el1#

很简单,答案就在这份文档和这份文档中
所以,你有一个像这样的yaml:

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

然后,首先绑定数据

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
}

然后在另一个组件中

@Autowired
private AllowedHosts allowedHosts;

你已经完成了!

h7appiyu

h7appiyu2#

在application.yml中使用逗号分隔值

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

用于访问的Java代码

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

我试过了,成功了;)

yzuktlbb

yzuktlbb3#

我已经能够从属性列表中读取如下方式-
属性-

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

读取属性-

@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;
    }
}
gk7wooem

gk7wooem4#

我遇到了同样的问题,但解决了,给予你我的解决方案

exclude-url: >
  /management/logout,
  /management/user/login,
  /partner/logout,
  /partner/user/login

在Sping Boot 2.1.6.RELEASE版本中获得成功

ev7lccsx

ev7lccsx5#

如下所示,以yml声明值列表
It says Could not resolve placeholder 'fruits' in value "${fruits}"
注入Java代码

@Value("${fruits}")
private List<String> fruits;

至少在spring 2.7.4版本中,spring-boot无法识别基于Yml的列表语法

fruits: 
  - apple
  - banana

It says Could not resolve placeholder 'fruits' in value "${fruits}"

相关问题