【问题标题】:Spring using wrong application.yamlSpring使用错误的application.yaml
【发布时间】:2021-08-17 21:59:08
【问题描述】:

我有一个 SpringBoot 应用程序,其中包含一组用于不同配置文件的 application.yaml 文件。 p>

application.yaml
application-dev.yaml
application-test.yaml

这些文件在类路径中,没有额外的配置来切换它们,除了在 intellij 的配置“活动配置文件”部分中更改配置文件。

我的一个 spring bean 依赖于属性

它有一个看起来像这样的构造函数

@Service
public class MyBean {
   private static appUrl;

   public MyBean(@Value("${application.app-url}") String appUrl){
      MyBean.appUrl = Objects.requireNotNull(appUrl);
   }
}

如果appUrl 在属性文件中不存在,那么整个过程fail bean 构造(从而导致应用程序无法启动)。

application.yamlapplication-dev.yaml 属性看起来像这样

application:
   app-url: http://someurl

我希望如果我从 application-dev.yaml 中删除 app-url,然后使用 dev 配置文件启动应用程序,它应该会失败。但是我发现,当该配置文件的属性丢失时,application.yaml 中的属性被取而代之。

两个问题:

  1. 如何防止这种“如果缺少,则从默认 application.yaml 中获取值”行为
  2. 是否有更好的方法来设置 MANDATORY 属性,以确保在缺少属性时应用程序在启动时失败

【问题讨论】:

  • 您是否在 VM 选项中添加 add -Dspring.profiles.active=dev(或您的配置文件名称)?

标签: java spring spring-boot yaml


【解决方案1】:

如果我没记错的话,那是不可能的。如果存在,Spring 将始终回退到 application.yml。查看https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config了解更多详情。

实现1和2的唯一方法是简单地删除application.yml

【讨论】:

    【解决方案2】:

    application.properties上的属性设置为

    local.so68824465.prop1=value1
    

    可以在application-dev.properties 上设置为null

    local.so68824465.prop1=#{null}
    

    测试类

    @Configuration
    @EnableConfigurationProperties
    public class ConfigProperties {
    
        @Value("${local.so68824465.prop1:zzzzzzz}")
        String prop1;
        
        @PostConstruct
        public void setup() {
            System.out.println("local.so68824465.prop1:" + (prop1 == null ? "is null" : prop1));
        }
    }
    

    案例#1 local.so68824465.prop1=dev-valueapplication-dev.properties

    SPRING_PROFILES_ACTIVE=dev ./gradlew bootRun
    

    local.so68824465.prop1:dev-value

    案例#2 local.so68824465.prop1=#{null}application-dev.properties

    SPRING_PROFILES_ACTIVE=dev ./gradlew bootRun
    

    local.so68824465.prop1: 为空

    案例 #3 没有具体的活动资料

    ./gradlew bootRun
    

    local.so68824465.prop1:value1

    案例 #4 两个文件都没有特定的活动配置文件和缺失的属性

    ./gradlew bootRun
    

    local.so68824465.prop1:zzzzzzz

    测试于:

    id 'org.springframework.boot' 版本'2.5.1'

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 1970-01-01
      • 2015-09-21
      • 2015-03-25
      • 2022-12-13
      • 2021-06-14
      • 2019-02-04
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多