【问题标题】:Spring Inject Values with @ConfigurationProperties and @Value使用 @ConfigurationProperties 和 @Value 注入值
【发布时间】:2022-01-21 13:07:16
【问题描述】:

如果 yaml props 文件中未定义属性,如何从 yaml 注入值并设置默认值?像下面这样同时使用 ConfigurationProperties 和 Value 是否有用?如果没有,我们还能如何实现它?

属性文件

app:
    prop1: test
    prop2: true
    map:
       key1: value1
       key2: value2

Java 类:

@Data
@Validated
@ConfigurationProperties("app")
public class properties {
   private String prop1;

  @Value("${app.prop2:default}")
  private Boolean prop2;

  @NestedConfigurationProperty
  @NotNull
  private Map<String,String> prop3;
}

【问题讨论】:

标签: java spring spring-boot


【解决方案1】:

同时使用 ConfigurationProperties 和 Value 就像下面这样很好用

没有。 @ConfigurationProperties 向 spring 表明它应该根据 java 字段的名称将它们绑定到一些匹配的属性。但是,要实现该 spring 要求具有此注释的类必须是 spring bean(代理类)。因此,您必须将它与 @Configuraiton@Component 或其他为此类创建 spring bean 的注释一起使用。

还有一些其他可用的功能,您可以在其他一些 spring bean 上使用另一个注释 @EnableConfigurationProperties(properties.class)(不是具有 @ConfigurationProperties 注释的当前类)

最常见的是您使用@Configuration,然后spring 将能够创建一个spring bean(此类的代理),然后将您期望的值绑定到您拥有的字段上。

既然您已经拥有@ConfigurationProperties("app"),那么名称为prop2 的属性将与应用程序属性app.prop2 绑定

@Data
@Validated
@Configuration <---------------
@ConfigurationProperties("app")
public class properties {
   private String prop1;

   private Boolean prop2;

  @NestedConfigurationProperty
  @NotNull
  private Map<String,String> prop3;
}

如果您的问题是默认值,以防 application.properties 中的属性根本不存在,那么您可以使用一些值初始化这些 java 字段。

@Data
@Validated
@Configuration <---------------
@ConfigurationProperties("app")
public class properties {
   private String prop1 = "default";

   private Boolean prop2 = false;

  @NestedConfigurationProperty
  @NotNull
  private Map<String,String> prop3;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2011-09-19
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多