我试图从应用程序加载字符串数组。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}"

我的猜测是,@Value不能处理“复杂”类型。你可以像这样去上道具课:

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

请注意:这段代码是Groovy(而不是Java),以保持示例简短!有关如何收养的建议,请参阅评论。

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


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

ignoreFilenames: .DS_Store, .hg

用于访问的Java代码

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

它正在工作;)


来自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的答案外,您还可以使用>符号向彗差分隔的字符串添加换行符。

application.yml:

ignoreFilenames: >
  .DS_Store, 
  .hg

Java代码:

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

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

YML 文件:

your:
 elements: element1, element2, element3

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;

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


在我的例子中,这是.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

它运行得很好。


我唯一能做的就是这样

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

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

别忘了你类上面的@Configuration ....

没有“别离”,就没有这样的运气……

也可以(引导1.5.8版本)

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

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

YML 文件:

your:
 elements: element1, element2, element3

有很多你可以玩春季法术。


yaml文件中的配置:

ignore:
    filenames: >
        .DS_Store
        .hg

弹簧组件:

@Value("#{'${gnore.filenames}'.split(' ')}")
private List<String> igonoredFileNames;

这对我来说很有效。