如何将 application.yml 中的地图注入 Spring Boot 中的字段?

Posted

技术标签:

【中文标题】如何将 application.yml 中的地图注入 Spring Boot 中的字段?【英文标题】:How to inject a map from application.yml into a field in Spring Boot? 【发布时间】:2020-03-01 05:00:35 【问题描述】:

这是参考这个问题。

Spring Boot - inject map from application.yml

在那个问题上,他们有

info:
   build:
      artifact: $project.artifactId
      name: $project.name
      description: $project.description
      version: $project.version

要将其映射到他们的 java 代码中,他们建议使用 @ConfigurationProperties 注释。这个注解的问题是你必须创建一个New Class 然后在它上面添加这个注解。

但是我可以像@Value 注释那样直接将它放到一个字段中吗?

在这里说我需要它:

// Someannotation or any other lean and clean way to get this
@Someannotation("$info")
private Map<String, Object> map;

上面的代码应该给我一个映射,其中键是build,值是some Object with fields like artifact, name etc(当然,如果这可行,我会为此创建一个POJO,而不是将其保留为普通对象)。

注意:@ConfigurationProperties 不适用于字段,这就是为什么我想看看是否有更精简和更清洁的方法来做到这一点。

附:我也可以使用@ConfigurationProperties 并创建一个新类,但我只是想看看我是否是missing out,以一种更简单的方式来执行此操作,而无需完全创建一个新类。

【问题讨论】:

我当然知道,所以这个问题。我想看看是否有另一种方法similar to @Value,而不必创建一个新类然后在@ConfigurationProperties 上拍打。 【参考方案1】:

我知道这样做的唯一方法是以 JSON 格式定义值部分:

app.collection.map.string.to.integer=one:"1", two:"2", three:"3"

然后注入

@Value("#$app.collection.map.string.to.integer")
private Map<String, Integer> mapStringToInteger;

来自https://relentlesscoding.com/2018/09/09/spring-basics-dynamically-inject-values-with-springs-value/ 部分 Inject Maps With Spring's @Value

【讨论】:

以上是关于如何将 application.yml 中的地图注入 Spring Boot 中的字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改application.yml中的info.app.name?

如何覆盖类属性中的 application.yml?

springBoot中的application.yml配置文件

Springboot - 从 application.yml 注入取决于方法名称

application.yml 中的 Spring Boot 日志设置

如何在春季启动测试中覆盖 application-test.yml?