Spring Boot yaml配置字符串列表

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)

我尝试过并且成功了;)

  • 在我自己的测试中,这等效于“.DS_Store, .hg”但不等于“.DS_Store”、“.hg”——后者因“org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping”而失败。因此,您在这里实际做的是将属性作为单个逗号分隔的字符串(然后 Spring 将其拆分为数组或列表)而不是 YAML 数组提供。这“有效”但没有回答最初的问题。我还没有找到一种方法来解析 @Value 注释的 bean 属性中的 YAML 数组。 (6认同)

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

  • 您可以绑定一个以“@Value”分隔的逗号(只要注册了转换器,我认为它将在 Spring Boot 中)。 (2认同)
  • 它正在拾取字符串设置,但不是List <String>设置 (2认同)
  • 还必须为该属性定义一个 getter。 (2认同)
  • 看起来这是一个限制与弹簧启动过程的注释 - https://github.com/spring-projects/spring-boot/issues/501 (2认同)

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)

效果很好。

  • 在 spring-boot 1.5 上尝试这个不起作用。bootstrap-servers 之后需要一个冒号 (3认同)
  • @Taugenicchts 你是对的,缺少一个冒号。引导服务器:&gt; (3认同)

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)

  • 这应该可以工作,顺便说一句,`getXxx()`是工作所必需的,并且必须使用“列表”,而不是“设置”。 (2认同)

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)

当项目很长并且不适合屏幕时,它很有用.


Dee*_*pak 8

艾哈迈德的回答提供了如何将逗号分隔的值分配给 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)

您可以通过自动装配在其他任何地方使用相同的列表。


Viv*_*nsi 8

@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 进行更多操作。


Rol*_*oos 6

好吧,我唯一能让它工作的就是这样:

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 次

最近记录:

6 年,6 月 前