Spring Boot:从YAML文件加载@Value

时间:2016-01-01 13:50:30

标签: java spring spring-boot yaml

我需要从.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. 当前目录的A / config子目录。

  2.   
  3. 当前目录

  4.   
  5. classpath / config包

  6.   
  7. 类路径根

  8.   

以及:

  

您还可以使用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文件包含一些其他属性,这些属性由dataSource.XXXhibernate.XXX等Spring Boot成功加载。

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

key:   
 key1: value
 key2: value

key:  
 key3: value

答案 2 :(得分:1)

例如:application.yml

key:
 name: description here

您的班级:

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

答案 3 :(得分:1)

我发现上面的代码对我不起作用,因为我试图在构造函数中访问变量。但是在建设中,该价值尚未注入。 最终,我可以使用以下变通办法进行工作:https://mrhaki.blogspot.com/2015/04/spring-sweets-using-value-for.html

也许这对其他人有帮助。

答案 4 :(得分:1)

在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();
     }
}

答案 5 :(得分:0)

我遇到了问题Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder,因为我已经在properties.yaml中设置了测试spring boot配置文件。 没有配置文件运行应用程序时,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);
  }
}