无法从 Spring Boot 应用程序中的自定义 yml 文件加载配置

Posted

技术标签:

【中文标题】无法从 Spring Boot 应用程序中的自定义 yml 文件加载配置【英文标题】:Cannot load config from custom yml file in spring boot application 【发布时间】:2017-11-16 08:30:55 【问题描述】:

我正在从我的 Spring Boot 服务中的 application.yml 加载自定义配置。

我已经通过bean类注释如下,

    @Component
    @ConfigurationProperties("app")
    public class ContinentConfig 

    private Map<String, List<Country>> continents = new HashMap<String, List<Country>>();

          //get/set/tostring methods
  

我的自定义类 Country 包括 2 个字段,

public class Country 

    String name;
    String capital;

    //get/set/tostring methods

在 application.yml 我有如下,

app:
  continents: 
    Europe: 
      - name: France
        capital: Paris
    Asia: 
      - name: China
        capital: Beijing       

通过上述设置,我可以从 application.yml 加载配置。

我现在想将配置提取到同一 src/main/resources 文件夹中的单独 continentconfig.yml 中。因此,我将自定义配置移到了continentconfig.yml,而将server.port 等其他属性留在了application.yml 中。

continentconfig.yml 的内容与我之前在 application.yml 中的内容相同。

我还在 ContinentConfig 类中添加了以下注释,

@Component
@ConfigurationProperties("app")
@EnableConfigurationProperties
@PropertySource(value="classpath:continentconfig.yml")
public class ContinentConfig 


在此更改之后,我看到配置没有从 continentconfig.yml 加载到 ContinentConfig bean。

有人可以帮忙解决这个问题吗?

【问题讨论】:

在这里看看这个答案:https://***.com/questions/21271468/spring-propertysource-using-yaml/54247009#54247009 .它很容易使用。 【参考方案1】:

简短的回答你不能这样做,你应该使用属性文件。

24.6.4 YAML 缺点

YAML 文件无法通过 @PropertySource 注解加载。所以在 如果您需要以这种方式加载值,则需要使用 属性文件。

您可以创建初始化程序并使用YamlPropertySourceLoader

【讨论】:

感谢您的澄清。但是,是否有另一种方法可以在它自己的 yml 文件中外部化自定义配置,也许将其用作特定于配置文件的 yml 文件。 您可以在application.yml 中拥有一个基本配置,并且您可以为所需的配置文件application-dev.yml 等覆盖它。使用YamlPropertySourceLoader 还有另一种解决方法。见***.com/questions/21271468/…【参考方案2】:

我相信外部化是指使用属性文件从 github/或其他此类托管存储库中配置的文件加载配置?您可以使用 bootstrap.yml 很好地做到这一点。这会从外部文件加载所有配置,并允许配置使用本地 application.properties/application.yml 覆盖它们

弹簧: 应用: 姓名: 云 : 配置: 网址:

还要确保你的 pom 中有 spring cloud 来解决这个问题,以防万一

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>

如果您的本地 yml 属性文件未加载到类路径中,请添加以下内容

<resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.jks</include>
                </includes>
            </resource>
        </resources>

注意:最好让 YamlPropertySourceLoader 将您的配置文件加载到您的类路径,除此之外,您还可以使用上述配置

【讨论】:

以上是关于无法从 Spring Boot 应用程序中的自定义 yml 文件加载配置的主要内容,如果未能解决你的问题,请参考以下文章

用于指定分发管理的自定义 spring boot 启动器

Spring Boot 中的自定义异常

带有spring-boot的自定义sql中的Liquibase参数

无法在 Spring Boot Security 中登录到我的自定义登录页面

java - 如何在spring boot java中编写一个函数来处理JPA存储库中的自定义查询?

Spring Boot中的自定义start pom