Spring无法从外部配置文件正确加载属性

时间:2019-01-13 23:58:52

标签: java spring-boot

我在类路径资源中有一个内部 application.yml 文件,其中包含以下字段:

redis:
  hostname: localhost
  port: 6379
  database: 0
  password:

有一个外部配置文件: config.properties 。它定义了一些在我的服务器上下文中要覆盖的字段。文件 config.properties

redis.hostname = db.example.com
redis.password = my_password

该应用程序无法启动,因为它无法读取配置文件中的redis.port属性。我的疑问是,如果spring已经在外部文件(在这种情况下为主机名,密码)中找到了某些定义的字段,则不会完全保留属性源( redis )的字段。

我正在使用以下命令运行应用程序:

java -jar -Dspring.config.location=file:///home/username/config.properties application.jar

如何使spring正确覆盖内部配置文件,使其仅覆盖额外的属性(redis.hostname,redis.password),但仍保留内部文件中定义的其他字段(如redis.port,redis)。数据库),但未在外部文件中定义?

P.S:我知道这是怎么回事,因为当我在外部配置文件中添加 redis.port = 6379 属性时,应用程序可以正常工作。

2 个答案:

答案 0 :(得分:0)

第1步:阅读Spring Boot documentation

  

以相反的顺序搜索配置位置。默认情况下,配置的位置是classpath:/,classpath:/config/,file:./,file:./config/。产生的搜索顺序如下:

file:./config/
file:./
classpath:/config/
classpath:/
     

使用spring.config.location配置自定义配置位置后,它们会替换默认位置。例如,如果将spring.config.location配置为值classpath:/custom-config/,file:./custom-config/,则搜索顺序变为:

file:./custom-config/
classpath:custom-config/

第2步:指定正确的值:

-Dspring.config.location=classpath:/,file:///home/username/config.properties

答案 1 :(得分:0)

file:

classpath:
在代码中绑定配置时需要指定

。指定-D参数时,可以传递相对于jar文件位置的属性文件的地址。