@ConfigurationProperties:绑定类中的默认值

use*_*611 5 spring-boot

我有一个配置类FooConfig,其中有一个绑定类“ Foo”。

@Configuration
@ConfigurationProperties("foo")
public class FooConfig {

  @Value("${foo.default.iterations}")
  private Integer iterations;

  private Foo foo;

  // getter / setter

}
Run Code Online (Sandbox Code Playgroud)

在我的课程中Foo,当未在properties-file中明确设置时,我希望迭代变量集具有现有的默认配置值。

public class Foo {

  private String name;

  @Value("${foo.default.iterations}")
  private Integer iterations;

  // getter / setter

}
Run Code Online (Sandbox Code Playgroud)

我的属性文件

foo.default.iterations=999

# if this is set this config is bound (wins) in FooConfig-class as expected
# foo.iterations=111

foo.foo.name=foo
Run Code Online (Sandbox Code Playgroud)

在Works中设置默认值FooConfig,但不在我的绑定类中设置默认值Foo。

我在这里想念什么?

And*_*son 16

你不应该混合@Value,并@ConfigurationProperties在同一个班。如果要在带@ConfigurationProperties注释的类中具有默认值,则可以使用默认值配置字段:

@ConfigurationProperties("foo")
public class FooConfig {

    private Integer iterations = 999;

    // getter / setter

}
Run Code Online (Sandbox Code Playgroud)

此更改带来了额外的好处,即在由生成的元数据中包括默认值spring-boot-configuration-processor。元数据是使用你的IDE提供的自动完成功能,当你在编辑application.properties和application.yaml文件。

最后,且与您的问题没有直接关系,@ConfigurationProperties带有-带注释的类不应带有注释@Configuration。带@Configuration注释的类用于通过@Bean方法配置Bean 。您的FooConfig班级应使用注释@Component或在要使用@EnableConfigurationProperties(FooConfig.class)的@Configuration班级上使用FooConfig。

  • 注释如何帮助您实现不硬编码默认值的目标?正如我已经提到的,您可以通过使用所需的默认值初始化字段来在代码中包含一个默认值。这有一个额外的好处,即在编译时被 Spring Boot 的配置处理器选取,以便默认值包含在您的 IDE 在提供自动完成时使用的元数据中。 (3认同)
  • 感谢您指出几个错误。但我最初的问题仍然存在:我的目标不是对默认值进行硬编码,而是在未设置的情况下从属性文件中检索它们。 (2认同)
  • 这与我以为您提出的问题不同。为此,我将使用“ EnvironmentPostProcessor”将包含默认值的单独文件加载到优先级非常低的新“ PropertySource”中,以便大多数甚至所有其他属性源都覆盖这些值。在配置默认值和任何替代值时,您将使用相同的键(例如`foo.iterations`)。 (2认同)