【问题标题】:Spring Boot: Load @Value from YAML fileSpring Boot:从 YAML 文件加载 @Value
【发布时间】:2016-04-06 00:44:21
【问题描述】:

我需要从.yml 文件加载一个属性,该文件包含应用程序可以从中读取文件的文件夹的路径。

我正在使用以下代码注入属性:

@Value("${files.upload.baseDir}")
private String pathToFileFolder;

用于开发的.yml 文件位于src/main/resources/config/application.yml 下,我在生产中使用以下命令运行应用程序,以覆盖开发设置:

java -jar app.jar --spring.config.location=/path/to/application-production.yml

Spring Boot 文档说:

SpringApplication 将从以下位置的 application.properties 文件中加载属性并将它们添加到 Spring 环境中:

  1. 当前目录的 /config 子目录。

  2. 当前目录

  3. 类路径 /config 包

  4. 类路径根

还有:

您还可以使用 YAML ('.yml') 文件来替代“.properties”。

.yml 文件包含:

{...}
files:
      upload:
        baseDir: /Users/Thomas/Code/IdeaProjects/project1/files
{...}

而我的Application 类被注释为:

@SpringBootApplication
@EnableCaching

当我运行应用程序时,我得到一个异常:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'files.upload.baseDir' in string value "${files.upload.baseDir}"

是否必须使用 YamlPropertySourceLoader 类或添加特殊注解才能在 Spring Boot 中启用对 .yml 的支持?

编辑: .yml 文件包含一些其他属性,这些属性可以由 Spring Boot 成功加载,例如 dataSource.XXXhibernate.XXX

【问题讨论】:

  • 用 --debug 运行你的程序
  • 您是否尝试过使用与开发中相同的.yaml 文件?只需将它带到项目之外并尝试使用命令执行它。这样,您将丢弃文件中的任何拼写错误。
  • 属性不存在...upload: 之前的空格太多。
  • 请查看我关于如何在 Spring 中读取 YAML 文件并将其包含在 JUnit 和 TestNG 测试中的评论:stackoverflow.com/a/37270778/3634283

标签: java spring spring-boot yaml


【解决方案1】:

例如:application.yml

key:
 name: description here

你的班级:

@Value("${key.name}")
private String abc;

【讨论】:

  • 我在 @Controller 中尝试,但根本不起作用....
【解决方案2】:

M. Deinum 是对的,我提供的设置正在运行 - yml 文件缩进错误,因此找不到该属性。

【讨论】:

  • 这是非常正确的。对于我的情况,我必须缩进我的配置,以便它位于 Spring 标题内。 Spring 文档没有提到这一点!
  • 您能否提供工作解决方案和“错误”解决方案之间的比较。目前尚不清楚,我应该怎么做才能使 @Value.yml 道具一起使用。谢谢!
【解决方案3】:

我发现上面的方法对我不起作用,因为我试图在构造函数中访问变量。但是在构建时,尚未注入该值。 最终我使用这个解决方法让它工作:https://mrhaki.blogspot.com/2015/04/spring-sweets-using-value-for.html

也许这对其他人有帮助。

【讨论】:

    【解决方案4】:

    对我来说,属性文件中的重复键导致了这个......

    我在大型 yml 文件中不知不觉地使用了相同的密钥。

    key:   
     key1: value
     key2: value
    
    key:  
     key3: value
    

    【讨论】:

      【解决方案5】:

      在 yml 属性文件中:

      xxxx:
           page:
              rowSize: 1000
      

      创建您的 Yaml 属性配置类:

      @Configuration
      @EnableConfigurationProperties
      @ConfigurationProperties(prefix = "xxxx")
      public class YmlPropertiesConfig {
      
          private Page page;
      
          public Page getPage() {
              return page;
          }
          public void setPage(Page page) {
              this.page = page;
          }
      
          public class Page {
              private Integer rowSize;
      
              public Integer getRowSize() {
                  return rowSize;
              }
      
              public void setRowSize(Integer rowSize) {
                  this.rowSize = rowSize;
              }
          }    
      }
      

      终于拿到并使用了:

      public class XXXXController {
      
           @Autowired
           private YmlPropertiesConfig ymlProperties;
      
           public String getIt(){
      
              Integer pageRowSize = ymlProperties.getPage().getRowSize();
           }
      }
      

      【讨论】:

        【解决方案6】:

        我遇到了这个问题Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder,因为我在 properties.yaml 中设置了测试弹簧启动配置文件。 运行没有配置文件的应用时,Spring 找不到测试配置文件的属性。

        所以从属性或 yaml 中删除 spring boot 配置文件或使用启用的配置文件运行应用程序。

        配置文件示例如下:

        @Configuration
        public class AppConfig {
          @Value("${prop.foo}")
          private String foo;
          @Value("${prop.bar}")
          private String bar;
        
          @Bean
          BeanExample beanExample() {
            return new BeanExample(foo, bar);
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-10-24
          • 2021-07-11
          • 1970-01-01
          • 2015-11-06
          • 1970-01-01
          • 1970-01-01
          • 2021-05-11
          • 2020-01-02
          • 2019-02-26
          相关资源
          最近更新 更多