记录中嵌套 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) {}
虽然更简单,但不太一致。
如何将具有嵌套属性的 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.
原来我没有针对我遇到的问题提出正确的问题:/ 因此,如果人们从类似的问题中找到这个主题,我的实际问题的答案如下。
问题出现在嵌套的 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) {}
虽然更简单,但不太一致。