【发布时间】:2022-01-01 21:37:05
【问题描述】:
我想使用 application.yml 而不是 application.properties
我正在使用:
- SpringBoot 2.6.2
- Java 17
- Gradle 7.3.2
我的 MCVE: https://github.com/OldEngineer1911/demo1
问题是:未加载属性。有人可以帮忙吗?
【问题讨论】:
标签: spring-boot configuration java-17
我想使用 application.yml 而不是 application.properties
我正在使用:
我的 MCVE: https://github.com/OldEngineer1911/demo1
问题是:未加载属性。有人可以帮忙吗?
【问题讨论】:
标签: spring-boot configuration java-17
你有以下代码
@SpringBootApplication
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
Products products = new Products(); <---------------------------------ERROR!!!
List<String> productsFromApplicationYml = products.getProducts();
System.out.println(productsFromApplicationYml.size()); // I would like to see 2
products.getProducts().forEach(System.out::println); // I would like to see "first" and "second"
}
@Component
@ConfigurationProperties(prefix="products")
public class Products {
private final List<String> products = new ArrayList<>();
public List<String> getProducts() {
return products;
}
}
错误出现在您的 main 方法的 Products products = new Products(); 行中。您不会从 Spring 上下文中检索 bean,而是在 JVM 中自己创建它。因此它就像你创建的那样是空的。
阅读更多内容以了解 Spring 如何为您的 Spring bean 使用代理,而不是您编写的实际类。
您需要的是以下内容
public static void main(String[] args) {
ApplicationContext app = SpringApplication.run(Demo1Application.class, args)
Products products = app.getBean(Products.class); <---Retrieve the Proxy instance from Spring Context
List<String> productsFromApplicationYml = products.getProducts();
System.out.println(productsFromApplicationYml.size())
编辑:
您还错误地配置了您的application.yml 文件。
products:
- first
- second
符号- 用于spring 将尝试从application.yml 序列化的复杂对象数组。检查我在this SO thread中的意思
考虑到您没有自定义对象列表,但原始List<String> 您的application.yml 应采用以下形式
products: first,second
【讨论】:
Products.class 中从 private List<String> products = new ArrayList<>();`` change it into private List“@Panagiotis Bougiokos”的解决方案部分正确:
Products products = app.getBean(Products.class); <---Retrieve the Proxy instance from Spring Context
是必需的,但其余的都是可选的(可以用 yml 两种方式编写 List)。解决方案是使用嵌套产品修复 yml 文件:
products:
products:
- 'first'
- 'second'
并且还为产品添加setter:
@Component
@ConfigurationProperties(prefix="products")
public class Products {
private List<String> products;
public List<String> getProducts() {
return products;
}
public void setProducts(List<String> products) {
this.products = products;
}
}
这是一个可行的解决方案(每个人都可以查看问题中提到的 Github)。无论如何,它仍然可以改进 - 不知道为什么我需要嵌套产品。
【讨论】: