Spring Boot yaml配置字符串列表

时间:2014-11-02 12:40:08

标签: spring-boot

我正在尝试从application.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}"

9 个答案:

答案 0 :(得分:75)

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

ignoreFilenames: .DS_Store, .hg

用于访问的java代码

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

我尝试过并且成功了;)

答案 1 :(得分:50)

我的猜测@Value无法应对&#34;复杂&#34;类型。你可以选择这样的道具类:

@Component
@ConfigurationProperties('ignore')
class IgnoreSettings {
    List<String> filenames
}

请注意:此代码 Groovy - 非Java - 以保持示例简短!请参阅评论以获取有关如何采用的提示。

请参阅完整示例https://github.com/christoph-frick/so-springboot-yaml-string-list

答案 2 :(得分:25)

从春季启动文档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;
    }
}

答案 3 :(得分:11)

除了Ahmet's answer之外,您还可以使用>符号将换行符添加到逗号分隔的字符串中。

application.yml

ignoreFilenames: >
  .DS_Store, 
  .hg

Java代码:

@Value("${ignoreFilenames}")    
String[] ignoreFilenames;

当项目太长而无法放入屏幕时,这很有用。

答案 4 :(得分:5)

@Value("#{'${your.elements}'.split(',')}")  
private Set<String> stringSet;

yml文件:

your:
 elements: element1, element2, element3

spring spEL可以玩的更多。

答案 5 :(得分:1)

Ahmet's answer提供了如何将逗号分隔的值分配给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;

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

答案 6 :(得分:0)

就我而言,这是.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注释的字段。当我将.yml文件中的语法更改为:

bootstrap-servers >
  s1.company.com:9092
  s2.company.com:9092
  s3.company.com:9092

工作正常。

答案 7 :(得分:0)

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

servers: >
    dev.example.com,
    another.example.com

@Value("${servers}")
private String[] array;

也不要忘记您班级上方的@Configuration。...

没有“,”分隔,没有这种运气...

也可以使用(从1.5.8版启动)

servers: 
       dev.example.com,
       another.example.com

答案 8 :(得分:-1)

@Value("${your.elements}")    
private String[] elements;

yml文件:

your:
 elements: element1, element2, element3