spring 从yaml文件读取Map

wqlqzqxt  于 2023-04-28  发布在  Spring
关注(0)|答案(2)|浏览(323)

从yaml文件(不是application.yaml)阅读其他属性时遇到问题。我试图解析字符串/字符串值的Map,但我得到NumberFormatException。Spring似乎试图将其读取为整数。下面是一个map的例子:

id:
  id1: -1001978483459
  id2: -1001978483457

和属性类:

@Data
@Configuration
@PropertySource("classpath:/id.yml")
public class ChatIdProperties {

    @Value("#{${id}}")
    Map<String, String> id;

}

我认为应该可以强制Spring将其解析为string或long,因为yaml中使用的数字很大,但我不知道如何做到这一点。我尝试使用!!str标记,结果为零

8dtrkrch

8dtrkrch1#

正在读取的yaml文件具有格式的值,默认情况下,这些值将被读取为数值。要强制将值读取为String,可以将值括在引号中(即:e.如果你是yaml文件的所有者,并且可以修改它)这应该可以做到。

id:
  id1: '-1001978483459'
  id2: '-1001978483457'
gojuced7

gojuced72#

application.yml:

myapp:
  ids:
    id1: -1001978483459
    id2: -1001978483457

MyAppProperties.java:

@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {

    private Map<String, String> ids;

    // accessors
}

Application.java:

@SpringBootApplication
@EnableConfigurationProperties(MyAppProperties.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    ApplicationListener<ApplicationReadyEvent> runnerListener(MyAppProperties myAppProperties) {
        return applicationReadyEvent -> System.out.println(myAppProperties.getIds());
    }

}

输出:

{id1=-1001978483459, id2=-1001978483457}

或者,如果你真的需要在属性中没有“myapp”前缀的情况下这样做:
application.yml:

id:
  id1: -1001978483459
  id2: -1001978483457

IdProperties.java:

@ConfigurationProperties
public class IdProperties {

    private Map<String, String> id;

    // accessors
}

Application.java:

@SpringBootApplication
@EnableConfigurationProperties(IdProperties.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    ApplicationListener<ApplicationReadyEvent> runnerListener(IdProperties idProperties) {
        return applicationReadyEvent -> System.out.println(idProperties.getId());
    }

}

输出:

{id1=-1001978483459, id2=-1001978483457}

如果您需要在中存储ID。yml,而不是在应用中。yml,那么一个简单的方法就是导入id。yml:
application.yml:

spring.config.import: id.yml

(从Sping Boot 2开始。4 afaik)
id.yml:

id:
  id1: -1001978483459
  id2: -1001978483457

我的答案的其余部分将叉罚款。
在你最初的帖子中,问题是@PropertySource不读取yml文件,只读取属性文件。因此,另一种方法是通过创建自定义PropertySourceFactory来使@PropertySource能够读取yml文件。此方法如下所述: www.example.com

相关问题