我试图从应用程序加载字符串数组。yml文件。这是配置:
ignore:
filenames:
- .DS_Store
- .hg
这是类片段:
@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();
在同一个类中,还有其他配置可以正常加载。我的YAML文件中没有选项卡。尽管如此,我还是得到了以下异常:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"
在我的例子中,这是.yml文件中的语法问题。我有:
@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;
我的。yml文件中的列表:
bootstrap-servers:
- s1.company.com:9092
- s2.company.com:9092
- s3.company.com:9092
没有读入@Value-annotated字段。当我将.yml文件中的语法更改为:
bootstrap-servers: >
s1.company.com:9092,
s2.company.com:9092,
s3.company.com:9092
它运行得很好。
来自spring引导文档https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
YAML列表被表示为带有[index]解引用的属性键,例如YAML:
my:
servers:
- dev.bar.com
- foo.bar.com
将转化为以下属性:
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
要使用Spring DataBinder实用程序(这就是@ConfigurationProperties所做的)绑定到这样的属性,你需要在java.util.List类型的目标bean中有一个属性,你要么需要提供一个setter,要么用一个可变值初始化它,例如,这将绑定到上面的属性。下面是问题代码的样子。
@ConfigurationProperties(prefix="ignore")
public class Filenames {
private List<String> ignoredFilenames = new ArrayList<String>();
public List<String> getFilenames() {
return this.ignoredFilenames;
}
}
Ahmet的回答提供了如何将逗号分隔的值分配给String数组。
要在不同的类中使用上述配置,您可能需要为此创建getter /setter ..
但如果你想加载这个配置一次,并继续使用它作为一个带有Autowired注释的bean,下面是我如何完成的:
在ConfigProvider.java
@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
return new ArrayList<String>();
}
在课外:
@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;
你可以通过自动装配在其他地方使用相同的列表。