我需要从.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环境中:
当前目录的A / config子目录。
当前目录
classpath / config包
- 醇>
类路径根
以及:
您还可以使用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.XXX
或hibernate.XXX
等Spring Boot成功加载。
答案 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);
}
}