我正在尝试使用git2consul和spring-boot-config-consul
方法来外部化配置。解决方案本身工作正常(因此,配置正确)。
要从consul获取配置,我使用application.yml
中的spring.config.import
spring:
config:
import: "consul:"
这个很好用然而,在一个集成测试中,我想用预定义的一组 prop 替换consul配置,并完全禁用consul。在我尝试之前
@TestPropertySource(properties = {
"spring.config.import=classpath:/consul/defaults.yml",
"spring.cloud.consul.enabled=false",
"spring.profiles.active = test"
})
public class MySpecialCaseITTest{}
然而,这失败是由于
java.lang.IllegalStateException: Unable to load config data from 'consul:'
如果我提供invalud类路径,那么它会失败,抱怨不存在文件(这是正确的),这意味着最有可能的是,我最终得到的是
`spring.config.import="classpath:/consul/defaults.yml,consul:`
或者反过来
如何有效地覆盖application.yml
中设置的spring.config.import
的值?(使用CLI参数具有相同的效果)
1条答案
按热度按时间lc8prwob1#
这里的问题是根据Spring文档
在发现导入时对其进行处理
这意味着从指定配置文件导入的所有内容都将被评估。由于您在默认的
application.yal
中为consul config定义了import,因此它将始终被评估。以下是spring-cloud中有关此行为的票证:https://github.com/spring-cloud/spring-cloud-config/issues/1877
而且,目前还没有解决办法。此问题的唯一解决方法:
解决方法1:在默认的
application.yml
中不使用导入。相反,创建一个新的配置文件application-consul.yaml
,并在需要从Consul加载配置的地方使用它。您可以使用多个配置文件(如consul,prod
)运行spring应用程序。解决方法2:为导入路径定义一个单独的属性,并在测试中替换它(在spring Boot 3.1.0上测试):