Spring Boot yaml 文件中数字类型的 @Value

maj*_*ych 5 java spring yaml spring-boot

我得到了一个data.yml具有以下结构的资源文件夹:

main:
  header:
    info: 3600L
Run Code Online (Sandbox Code Playgroud)

我使用 Spring Boot 版本 2.4.2,我想将属性注入main.header1.info到字段中,我按以下方式执行此操作:

@Component
@PropertySource("classpath:data.yml")
public class SomeClass {
    @Value("`main.header1.info")
    private long info;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但出现了一个NumberFormatException情况:

java.lang.NumberFormatException: For input string: "main.header1.info"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:na]
    at java.base/java.lang.Long.parseLong(Long.java:692) ~[na:na]
    ...
Run Code Online (Sandbox Code Playgroud)

我知道long中不支持这一点yml,但我认为情况并非如此。我尝试了其他数字类型和相应的包装类,例如Double. 那么,如何解决这个问题呢?

Ami*_*mar 2

我建议使用application.yml文件,尽管自定义YAML文件。

原因application.properties是spring的默认配置文件。如果您使用它,您不必担心手动将文件加载到上下文,因为 spring 会处理它。但是,在您的情况下,您正在尝试从自定义 YAML 文件加载和读取值。所以, @PropertySource这里无济于事。

有关 YAML 缺点的详细信息,请参阅spring-docs 。

但是,如果您仍然希望从自定义 yaml 中读取值,您将需要编写一个自定义类(例如CustomYamlPropertySourceFactory:)来实现PropertySourceFactory并通知@PropertySource使用此工厂类。

参考代码 :

    @Component
    @PropertySource(value = "classpath:date.yml", factory = CustomYamlPropertySourceFactory.class) 
    public class SomeClass {

    @Value("${main.header.info}")
    private int info;
}
Run Code Online (Sandbox Code Playgroud)