Spring Boot - 加载多个 YAML 文件
Posted
技术标签:
【中文标题】Spring Boot - 加载多个 YAML 文件【英文标题】:Spring Boot - Load multiple YAML files 【发布时间】:2016-10-24 19:02:45 【问题描述】:我正在为我的项目使用 Spring boot,并尝试加载 yaml 文件,以便我可以使用项目中文件中的数据。例如,我的 application.yml 中有如下内容。
currency:
code:
840: 2
484: 2
999: 0
在我从 application.yml 读取内容的代码中,我有一个这样的类。
import java.util.Map;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "currency")
public class Currency
private Map<String, String> code;
public Map<String, String> getCode()
return code;
public void setCode(Map<String, String> code)
this.code = code;
如果我在测试类中打印它
public class Test
@Autowired
Currency currency;
Map<String, String> test = currency.getCode();
for (Map.Entry<String, String> entry : test.entrySet())
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
我觉得下面是完美的。
Key : 840 Value : 2
Key : 484 Value : 2
Key : 999 Value : 0
如果我将 application.yml 保存在我的 jar 中,或者我也可以通过将它放在 git repo 中来读取它,这将起作用。
我尝试将内容保存在currency.yml 中,在我的application.yml 中我尝试使用spring.config.location,以便我可以直接从currency.yml 中读取内容,但它不起作用。
我想加载像currency.yml 和codes.yml 等自定义yml 文件这样的文件,以便我可以读取多个文件内容并在我的应用程序中使用。是否有任何注释或某种方法可以用来加载 custom.yml 文件?
【问题讨论】:
你查看***.com/questions/28303758/…了吗?这里 yaml 文件是通过简单的 PropertyPlaceholderConfigurer 及其特定配置加载的。 @tkachuko 不。会尝试的。谢谢。 @Arun 你试过了吗? @AdrianIvan 嘿,不,我没有,但是当我有机会时,我需要这样做。 【参考方案1】:在项目的 .yml 文件中添加以下内容。
spring:
profiles:
include:
- currency
注意:如果需要,您可以通过这种方式引用多个 .yml 文件。您需要额外的 .yml 文件和 Config 类,如下例所示。
您需要有另一个 .yml 文件,即 application-currency.yml
在 application-currency.yml 中您可以添加货币,如下所示
currencies:
mappings:
USD:
fraction: 2
symbol: $
text: "US Dollar"
MXN:
fraction: 2
symbol: $
text: "Mexican Peso"
您的配置类如下所示。
package com.configuration;
import com.Currency;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "currencies")
public class CurrencyConfiguration
private Map<String, Currency> mappings;
public Map<String, Currency> getMappings()
return mappings;
public void setMappings(Map<String, Currency> mappings)
this.mappings = mappings;
无论您需要在哪里使用货币详细信息,您都可以通过如下所示的调用获得。
@Autowired
private CurrencyConfiguration currencyConfiguration;
String currencyCodeAlpha3 = "USD";
Currency currency = currencyConfiguration.getMappings().get(currencyCodeAlpha3);
【讨论】:
虽然这确实有效,但感觉就像是在滥用 Spring 配置文件。 Spring 配置文件旨在支持不同的(松散定义的)“环境”,在不同的环境中设置不同的值:[Bean 定义配置文件](docs.spring.io/spring-framework/docs/current/reference/html/…)。货币列表在概念上不是一个环境,而是应该始终存在的东西。【参考方案2】:您可以使用spring.config.location
将其他配置文件的路径指定为逗号分隔列表。
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
【讨论】:
@Arun 你试过了吗?以上是关于Spring Boot - 加载多个 YAML 文件的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot2 系列教程 | yaml 配置文件详解
Spring Boot MockMVC 测试不加载 Yaml 文件
带有密钥 URL 的 Spring Boot YAML 配置不再使用版本 2 正确加载
如果 yaml 文件不是 application.yml,则未正确加载 spring boot 应用程序上下文