spring.config.location 在 Spring Boot 2.0.0 M6 上不起作用

Posted

技术标签:

【中文标题】spring.config.location 在 Spring Boot 2.0.0 M6 上不起作用【英文标题】:spring.config.location not working on spring boot 2.0.0 M6 【发布时间】:2018-04-22 21:21:23 【问题描述】:

我正在将我的一个微服务迁移到 Spring Boot 2.0.0.M6,但在命令行上使用 --spring.config.location= 选项时出现错误。错误如下:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'property' in value "$property"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) ~[spring-core-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237) ~[spring-core-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211) ~[spring-core-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:834) ~[spring-beans-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1081) ~[spring-beans-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1060) ~[spring-beans-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:578) ~[spring-beans-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.1.RELEASE.jar:5.0.1.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:367) ~[spring-beans-5.0.1.RELEASE.jar:5.0.1.RELEASE]
... 50 common frames omitted

如果我不使用自定义属性文件,一切都会按预期工作,或者使用 RELEASE 版本。我正在使用以下命令启动应用程序:

java -jar application.jar --spring.config.location=app.properties

更新

我注意到,当使用这个选项时,Spring 完全替换了项目中的默认 application.properties,这与之前的 Spring 版本不同,它只是覆盖了参数文件中的属性。这是一个错误吗?

更新 2

从团队获得response,显然这是有意的行为。现在想知道是否有办法使用旧版本的行为。

【问题讨论】:

在回复中,Andy 给了你一个指向使用旧行为方式的链接:spring.config.additional-location 而不是spring.config.location @EvgeniDimitrov 是的,我之前尝试过,但没有成功。一定是输入错误或其他东西,因为当我再次尝试时它起作用了 【参考方案1】:

正如 Spring 团队所说,使用 spring.config.location 的旧行为的正确方法是使用新的 spring.config.additional-location

【讨论】:

请提供示例 供参考,这里是migration guide和actual documentation中的相关项。【参考方案2】:

您的项目结构会很有帮助。但除此之外。

Spring 文档给出了如何使用该标志的示例:

    --spring.config.location=classpath:/default.properties

尝试根据类路径解析您的应用程序属性。

【讨论】:

我使用默认结构(src/main/resouces/application.yml),但这不是问题。我在 Spring Boot 的发布版本中使用了 ok 标志,但现在里程碑版本替换了该文件。刚收到团队回复:github.com/spring-projects/spring-boot/issues/10971

以上是关于spring.config.location 在 Spring Boot 2.0.0 M6 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

spring.config.additional-location 作为环境变量

spring boot 外部配置文件1-spring.config.location与spring.config.additional-location的区别

spring boot 外部配置文件1-spring.config.location与spring.config.additional-location的区别

spring boot 外部配置文件1-spring.config.location与spring.config.additional-location的区别

如何在使用命令行 Gradle (6.4) 构建 Spring Boot 应用程序时传递 spring.config.location="some path"

springboot 外部配置文件spring.config.location 为什么不生效?