记录中嵌套 Spring 配置 (ConfigurationProperties)

Nested Spring configuration (ConfigurationProperties) in records

如何将具有嵌套属性的 application.yaml 配置映射到 Java 中的类似记录结构?

例如,如果我们有以下 yaml:

foo:
    bar:
        something: 42

    baz:
        otherThing: true

    color: blue

所需的记录结构类似于:

@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
public record Foo(
    Bar bar,
    Baz baz,
    String color
) {}

// ---

@ConfigurationProperties(prefix = "foo.bar")
@ConstructorBinding
public record Bar(
    int something
) {}

// ---

@ConfigurationProperties(prefix = "foo.baz")
@ConstructorBinding
public record Baz(
    boolean otherThing
) {}

每个嵌套 class 不需要 @ConfigurationProperties。它只针对根 class (Foo.class)。然后通过在 class 上方插入 @Component 或将 @ConfigurationPropertiesScan 放在应用程序 class.

上,将 Foo 作为 Spring Bean

原来我没有针对我遇到的问题提出正确的问题:/ 因此,如果人们从类似的问题中找到这个主题,我的实际问题的答案如下。

问题出现在嵌套的 yaml 试图在模型层次结构上“走捷径”,因此给出以下 yaml:

foo:
    bar:
        baz:
            bum: "hello"

我试图按如下方式对层次结构进行建模:

@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
public record Foo(BarBaz barBaz) {}

// --- 

@ConfigurationProperties(prefix = "foo.bar.baz")
@ConstructorBinding
public record BarBaz(String bum) {}

这里出现了问题,Foo 无法为 BarBaz 进行构造函数绑定(不知道为什么)。所以我找到了两种可能的解决方案:

1.做完整的建模(决定这是我喜欢的)

也就是说,不要试图跳过 bar 的中间模型。

@ConfigurationProperties(prefix = "foo")
@ConstructorBinding
public record Foo(Bar bar) {}

// ---

@ConfigurationProperties(prefix = "foo.bar")
@ConstructorBinding
public record Bar(Baz baz) {}

// --- 

@ConfigurationProperties(prefix = "foo.bar.baz")
@ConstructorBinding
public record Baz(String bum) {}

2。嵌套较多时不要使用@ConstructorBinding

直接跳过Foo中的构造函数绑定。

@ConfigurationProperties(prefix = "foo")
public record Foo(BarBaz barBaz) {}

// --- 

@ConfigurationProperties(prefix = "foo.bar.baz")
@ConstructorBinding
public record BarBaz(String bum) {}

虽然更简单,但不太一致。