Spring boot @ConfigurationProperties:绑定类中的默认值
我有一个配置类Spring boot @ConfigurationProperties:绑定类中的默认值,spring-boot,Spring Boot,我有一个配置类FooConfig,其中有一个绑定类'Foo' @Configuration @ConfigurationProperties("foo") public class FooConfig { @Value("${foo.default.iterations}") private Integer iterations; private Foo foo; // getter / setter } 在我的类Foo中,当属性文件中没有显式设置时,我希望使用现有的默
FooConfig
,其中有一个绑定类'Foo'
@Configuration
@ConfigurationProperties("foo")
public class FooConfig {
@Value("${foo.default.iterations}")
private Integer iterations;
private Foo foo;
// getter / setter
}
在我的类Foo
中,当属性文件中没有显式设置时,我希望使用现有的默认配置值设置迭代变量
public class Foo {
private String name;
@Value("${foo.default.iterations}")
private Integer iterations;
// getter / setter
}
我的属性文件
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
在FooConfig
中设置默认值有效,但在我的绑定类Foo
中不起作用
我这里缺少什么?您不应该在同一个类中混合使用
@Value
和@ConfigurationProperties
。如果希望在@ConfigurationProperties
-注释类中具有默认值,可以使用默认值配置字段:
@ConfigurationProperties("foo")
public class FooConfig {
private Integer iterations = 999;
// getter / setter
}
此更改带来了额外的好处,即在spring引导配置处理器生成的元数据中包含默认值。IDE使用元数据在编辑application.properties
和application.yaml
文件时自动完成
最后,与您的问题没有直接关系的是,@ConfigurationProperties
-注释类不应使用@Configuration
注释。@Configuration
-注释类用于通过@Bean
方法配置Bean。您的FooConfig
类应该使用@Component
进行注释,或者您应该在想要使用FooConfig的@configurationproperties(FooConfig.class)
类上使用@EnableConfigurationProperties(FooConfig.class)
,无需显式地为迭代变量赋值。
请尝试使用以下方法(在冒号后面添加默认值,例如100500):
@Value(${foo.iterations:100500}”)
顺便说一句,@Configuration
注释是冗余的将默认值放入资源/应用程序.yml
然后,您可以通过提供一个外部application.yml
(外部打包jar)文件来覆盖它们。感谢您指出了几个错误。但我最初的问题仍然存在:我的目标不是硬编码默认值,而是在未设置的情况下从a属性文件中检索它们。这与我认为您提出的问题不同。为此,我将使用环境后处理器
将包含默认值的单独文件加载到具有极低优先级的新属性源
,以便大多数甚至所有其他属性源覆盖这些值。在配置默认值和任何覆盖时,您会使用相同的键(例如foo.iterations
),再次感谢您为我指点迷津。但在这种情况下,我认为它的开销太大了。如果Spring有一天会提出某种@DefaultValue
注释,那就太好了。注释如何帮助您实现不硬编码默认值的目标?正如我已经提到的,通过使用所需的默认值初始化字段,可以在代码中包含默认值。这还有一个额外的好处,就是SpringBoot的配置处理器在编译时会选择默认值,这样默认值就会包含在IDE提供自动完成时使用的元数据中。