对于应用程序配置定义的application.properties,Spring是否遵循任何命名约定?

Pankaj:

我面对的是Spring配置的奇怪问题,因为application.properties以特定方式命名配置时,环境变量不会覆盖其中定义的配置。外部化配置 OS中所述,环境变量优先于,application.properties但是在将配置定义为时不会发生这种情况,myExternal_url但是在将配置定义为时才起作用my_external_url(在下面的示例代码中,我们需要将配置更改为my_external_urlin ApplicationProperties.javaapplication.properties

示例代码-

@SpringBootApplication
public class ConfigApplication implements ApplicationRunner {

  @Autowired private ApplicationProperties applicationProperties;

  public static void main(String[] args) {
    SpringApplication.run(ConfigApplication.class, args);
  }

  @Override
  public void run(ApplicationArguments arg0) {
    System.out.println("External URL = " + applicationProperties.getMyExternalUrl());
  }
}

应用Bean配置-

@Configuration
public class AppConfig {

  @Bean
  @ConfigurationProperties(prefix = "")
  public ApplicationProperties applicationProperties() {
    return new ApplicationProperties();
  }
}

ApplicationProperties 类-

public class ApplicationProperties {

  @Value("${myExternal_url}")
  private String myExternalUrl;

  public String getMyExternalUrl() {
    return this.myExternalUrl;
  }

  public void setMyExternalUrl(String myExternalUrl) {
    this.myExternalUrl = myExternalUrl;
  }
}

application.properties

myExternal_url=external_url_env_application_properties

这可能是什么原因?

编辑-添加gradle Gradle配置

plugins {
    id 'org.springframework.boot' version '2.4.0-M1'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    compileOnly 'org.projectlombok:lombok:1.18.6'
    annotationProcessor 'org.projectlombok:lombok:1.18.6'
}

test {
    useJUnitPlatform()
}

编辑2

跟踪日志显示myExternal_url已从Environment变量正确解析。然后,Spring尝试applicationProperties通过调用解析自动装配的依赖项' ' AutowiredAnnotationBeanPostProcessor,然后使用application.properties值覆盖该值(屏幕截图)。

o.s.c.e.PropertySourcesPropertyResolver  : Found key 'myExternal_url' in PropertySource 'systemEnvironment' with value of type String
o.s.c.e.PropertySourcesPropertyResolver  : Found key 'myExternal_url' in PropertySource 'environmentProperties' with value of type String

调试应用程序属性

梦中梦:

TL; DR 从注入的系统变量中得出了@Value正确的myExternal_Url信息,但其值稍后由设置@ConfigurationProperties

跟踪日志是正确的,因为来自Spring的顺序将放在propertySource列表中的systemEnvironment前面classpath:/application.properties

您遇到的问题是由于同时使用@Value@ConfigurationProperties插入/绑定属性而引起的。说这些是您提供的值:

system:
  myExternal_Url: foo
  my_external_url: bar
applications.properties:
  myExternal_url: aaa

在您的ApplicationProperties中:

  @Value("${myExternal_url}")
  private String myExternalUrl; // injected with foo

myExternalUrl正确注入了foo您在环境变量中定义的值()。但是,使用setter方法@ConfigurationProperties绑定值之后由于它使用宽松的绑定,因此会检查的不同变体myExternalUrl,它首先查找系统变量中的内容,然后发现myExternal_url(骆驼和Underscore)都不是宽松的绑定形式之一,然后my_external_url(仅下划线)出现。因此my_external_url,将的值提供给setter:

public void setMyExternalUrl(String myExternalUrl) { // bar
  this.myExternalUrl = myExternalUrl; // myExternalUrl is reassigned from foo to bar
}

因此应该清楚,@Value由于@ConfigurationProperties绑定值之后,您将始终被覆盖只需拥有:

public class ApplicationProperties {
    private String myExternalUrl;
    ...

然后在系统中定义一种绑定形式- MY_EXTERNAL_URLmy-external-urlmy_external_url(也许还有更多)。然后,在application.yml中使用一致的大小写,以防不希望使用系统变量。

my-external-url=aaa

边注。建议您将该表格MY_EXTERNAL_URL用作系统环境变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring应用程序的库模块如何向应用程序的application.yml中添加其他配置?

如何在我的application.properties文件的Spring Boot应用程序中配置HikariCP?

Spring Boot应用程序:无法获取application.properties?

如何在Spring Boot应用程序中配置PageableHandlerMethodArgumentResolver

在Spring Boot应用程序中使用@Configuration访问配置

Spring是否遵循应用程序配置的任何命名约定?

如何为Spring Boot应用程序配置端口

在Spring MVC应用程序中,服务层使用什么命名约定?

Spring应用程序上下文XML的命名约定

对于负载很重的Web应用程序,Jetty 8中的默认配置是否合理?

对于抛出异常的Java方法,是否有特定的命名约定?

对于非Web应用程序,Spring的ContextLoader是否等效?

在Spring应用程序中配置Jaeger

如何在Spring Boot应用程序的application.properties文件中设置MyBatis配置属性?

在Spring-Boot应用程序中使用application.yaml配置hystrix命令属性

多层应用程序中的模型命名约定

在客户端Spring Boot应用程序上配置自定义OAuth2AccessToken

在Spring应用程序中使用application.properties

是否可以使用gluon的client-maven-plugin配置自定义mac osx应用程序图标集?

Quarkus:如何在应用程序外部或在运行时定义和读取属性文件(或application.properties)?

CakePHP是否支持初始配置/ Web应用程序安装?

用于Spring框架应用程序的多套配置

对于Heroku应用程序,是否按dyno存储变量?

HWND值对于文件/应用程序是否恒定?

在配置文件Rails 4中命名应用程序

在测试整个应用程序之前是否应该配置应用程序的安全性?

如何正确配置我的 Spring Boot 应用程序?

配置 HTTP 端点以关闭 Spring Boot Web 应用程序

使用 application.yaml 而不是 application.properties 配置应用程序