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 应用程序上下文

Spring Boot application.yaml中多个默认环境变量的语法

Spring Boot 之属性读写详解