当前位置: 首页 > 知识库问答 >
问题:

Yaml 属性未在Spring靴中加载

戚阳文
2023-03-14

我想使用应用程序.yml 而不是应用程序属性

我跟着: https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-features-external-config.html

我正在使用:

  • 春靴 2.6.2
  • 爪哇 17
  • 渐变 7.3.2

我的https://github.com/OldEngineer1911/demo1 MCVE

问题是:属性未加载。有人能帮忙吗?

共有2个答案

陶刚豪
2023-03-14

“@Panagiotis布吉奥科斯”的解决方案部分正确:

Products products = app.getBean(Products.class); <---Retrieve the Proxy instance from Spring Context

是必需的,但其余的都是可选的(可以用两种方式在yml中编写列表)。解决方案是使用嵌套产品修复 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)。无论如何,它仍然可以改进 - 不知道为什么我需要嵌套产品。

海岳
2023-03-14

您有以下代码

@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=new Products();行中。您不从Spring上下文中检索bean,而是在JVM中自己创建它。因此,它就像您创建它一样是空的。

阅读更多内容,了解Spring如何使用spring beans的代理,而不是您编写的实际类。

您需要的是以下内容

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将尝试从应用程序.yml序列化。检查我在这个SO线程中的含义

考虑到您没有一个定制对象的列表,而是一个基本的< code >列表

products: first,second
 类似资料:
  • 我使用自动配置(仅通过注释)运行Spring启动和kafka,并在.yaml文件中定义了道具,即: 它工作得很好,spring maps即字段group-id正确。 但是当我尝试使用相同的yaml文件手动配置Kafka(使用消费者工厂和消费者配置)时,我遇到了问题。在类中,消费者配置Kafka属性以 命名。在名称中,而不是 _ 即: 所以我不能把它们加载到map中,然后把map传递给Consume

  • 我在Java spring-boot应用程序的src/main/resources中定义了以下application-errors.yml文件: 请注意,我尝试了两种不同的格式来指定属性。 我通过@Configuration注释类中的以下Bean加载该属性文件: 我看到属性是通过Spring环境变量加载的,但不是我所期望的模式。调试时,我可以看到加载的属性文件的源包含以下值: 看起来 yaml 文

  • 我有一个Spring Boot应用程序,它有一些配置属性。我正在尝试为一些组件编写测试,并希望从< code>test.properties文件中加载配置属性。我不能让它工作。 这是我的代码: 文件(在src/test/resources下): 配置属性类: 我的测试: 测试失败,并显示“预期实际不为空”,这意味着未设置配置属性类中的属性。

  • 我有一个Spring Boot应用程序如下: 我正在使用spring配置文件,并根据活动配置文件加载一个正确的特定环境文件:utils-local.properties、utils-dev.properties等。 当通过application.properties(spring)设置配置文件时,例如spring.profiles.active=local all工作良好,将加载正确的文件(uti

  • 我已经在stackoverflow和网络上寻找解决方案。我没有见过有效的解决方案,因为可能没有一个帖子完全符合我的用例,它包含文件中的列表和对象结构。 这里有一个例子作为yaml 这是与属性文件相同的示例 我希望能够向我的应用程序提供 teddy.yml 或 teddy.properties 文件以进行配置。 这是我的课程: 我已经尝试了这种设置,使用环境来尝试访问属性,删除前缀,声明一个“Pro