Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot @ConfigurationProperties:绑定类中的默认值_Spring Boot - Fatal编程技术网

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提供自动完成时使用的元数据中。