SpringBoot无法绑定应用程序下的属性

时间:2019-11-27 15:34:51

标签: spring spring-boot

我有一个带有gradle的SpringBoot 2.1.7.RELEASE项目。当我尝试使用@ConfigurationProperties

时出现错误

我要绑定的属性存在于我的application-default.properties中,如果我使用Itellij运行该项目,则可以看到该属性已吸收到我的组件中。

如果启用@EnableConfigurationProperties,则会出现错误。

我的application-default.properties

app.forwarding-endpoint=localhost:8080

我的AppProperties.java

@ConfigurationProperties(prefix = "app", ignoreUnknownFields = false)
@Validated
@Data
public class AppProperties {
   @NotBlank
   @Pattern(regexp = "^(.+):\\d+$")
   private String forwardingEndpoint;
}

我的Application.java

@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class Application {
  public static void main(String[] args) {
      SpringApplication.run(Application .class, args);
  }
}

我正在使用该属性的组件:

 public MyComponent(@Value("${app.forwarding-endpoint}") String forwardingEndpoint) {
    log.info("Forwarding endpoint {}", forwardingEndpoint);
 }

我得到的错误是:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'app' to com.config.AppProperties failed:

Property: app.forwardingEndpoint
Value: null
Reason: must not be blank

我想念什么?

1 个答案:

答案 0 :(得分:0)

原因按初始化顺序。 您没有填写AppProperty,而是开始在组件中使用它。您还需要将此类作为组件进行注释,但是从体系结构的角度来看,这不是一个好方法。

@ConfigurationProperties的概念对于Spring来说是很原始的,如果不进行一些操作,您将很难强制其正常工作。我提出了一个简单的“技巧”(或“另一种方法”):

ZonedDateTime

(我认为@validated的位置不在实体/ DO中)。

然后在您的@Configuration下一个代码中放置

@Data
public class AppProperties {
   @NotBlank
   @Pattern(regexp = "^(.+):\\d+$")
   private String forwardingEndpoint;
}

接下来,您可以在任何组件中注入AppProperties bean。