Bah*_*ğan 122 spring-boot
我试图从application.yml文件加载一个字符串数组.这是配置:
ignore:
filenames:
- .DS_Store
- .hg
Run Code Online (Sandbox Code Playgroud)
这是班级:
@Value("${ignore.filenames}")
private List<String> igonoredFileNames = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
在同一个类中还有其他配置加载就好了.我的yaml文件中没有选项卡.我仍然得到以下异常:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ignore.filenames' in string value "${ignore.filenames}"
Run Code Online (Sandbox Code Playgroud)
Ahm*_*gaç 104
在application.yml中使用逗号分隔值
ignoreFilenames: .DS_Store, .hg
Run Code Online (Sandbox Code Playgroud)
用于访问的java代码
@Value("${ignoreFilenames}")
String[] ignoreFilenames
Run Code Online (Sandbox Code Playgroud)
我尝试过并且成功了;)
cfr*_*ick 59
我的猜测是,@Value无法应对"复杂"类型.你可以使用这样的道具类:
@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
List<String> filenames
}
Run Code Online (Sandbox Code Playgroud)
请注意:此代码是Groovy - 而不是Java - 以保持示例简短!有关如何采用的提示,请参阅注释.
请参阅完整示例https://github.com/christoph-frick/so-springboot-yaml-string-list
Mat*_*ell 41
就我而言,这是 .yml 文件中的语法问题。我有:
@Value("${spring.kafka.bootstrap-servers}")
public List<String> BOOTSTRAP_SERVERS_LIST;
Run Code Online (Sandbox Code Playgroud)
以及我的 .yml 文件中的列表:
bootstrap-servers:
- s1.company.com:9092
- s2.company.com:9092
- s3.company.com:9092
Run Code Online (Sandbox Code Playgroud)
没有读入@Value- 注释字段。当我将 .yml 文件中的语法更改为:
bootstrap-servers: >
s1.company.com:9092,
s2.company.com:9092,
s3.company.com:9092
Run Code Online (Sandbox Code Playgroud)
效果很好。
dsk*_*kow 29
从spring boot docs 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
Run Code Online (Sandbox Code Playgroud)
将转化为这些属性:
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
Run Code Online (Sandbox Code Playgroud)
要使用Spring DataBinder实用程序绑定到类似的属性(这是什么@ConfigurationProperties),你需要在类型的目标bean中拥有一个属性java.util.List,你需要提供一个setter,或者用一个可变值初始化它,例如这将绑定到上面的属性.这是问题代码的样子.
@ConfigurationProperties(prefix="ignore")
public class Filenames {
private List<String> ignoredFilenames = new ArrayList<String>();
public List<String> getFilenames() {
return this.ignoredFilenames;
}
}
Run Code Online (Sandbox Code Playgroud)
Sas*_*ota 20
作为Ahmet答案的补充,您可以使用>符号为逗号分隔的字符串添加换行符.
的>:
ignoreFilenames: >
.DS_Store,
.hg
Run Code Online (Sandbox Code Playgroud)
Java代码:
@Value("${ignoreFilenames}")
String[] ignoreFilenames;
Run Code Online (Sandbox Code Playgroud)
当项目很长并且不适合屏幕时,它很有用.
艾哈迈德的回答提供了如何将逗号分隔的值分配给 String 数组。
要在不同的类中使用上述配置,您可能需要为此创建 getter/setter .. 但是如果您想加载此配置一次并继续将其用作带有 Autowired 注释的 bean,这是我如何完成的:
在 ConfigProvider.java 中
@Bean (name = "ignoreFileNames")
@ConfigurationProperties ( prefix = "ignore.filenames" )
public List<String> ignoreFileNames(){
return new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)
在课外课:
@Autowired
@Qualifier("ignoreFileNames")
private List<String> ignoreFileNames;
Run Code Online (Sandbox Code Playgroud)
您可以通过自动装配在其他任何地方使用相同的列表。
@Value("#{'${your.elements}'.split(',')}")
private Set<String> stringSet;
Run Code Online (Sandbox Code Playgroud)
yml文件:
your:
elements: element1, element2, element3
Run Code Online (Sandbox Code Playgroud)
您可以使用 spring spEL 进行更多操作。
好吧,我唯一能让它工作的就是这样:
servers: >
dev.example.com,
another.example.com
@Value("${servers}")
private String[] array;
Run Code Online (Sandbox Code Playgroud)
并且不要忘记您班级上方的@Configuration....
没有“,”分隔,就没有这样的运气......
也可以工作(启动 1.5.8 版)
servers:
dev.example.com,
another.example.com
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
110224 次 |
| 最近记录: |