diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 511b3968889..831758b5719 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -1070,9 +1070,13 @@ as `@Valid` to trigger its validation. For example, building upon the above ---- You can also add a custom Spring `Validator` by creating a bean definition called -`configurationPropertiesValidator`. There is a -{github-code}/spring-boot-samples/spring-boot-sample-property-validation[Validation sample] -so you can see how to set things up. +`configurationPropertiesValidator`. The `@Bean` method should be declared `static`. The +configuration properties validator is created very early in the application's lifecycle +and declaring the `@Bean` method as static allows the bean to be created without having to +instantiate the `@Configuration` class. This avoids any problems that may be caused by +early instantiation. There is a +{github-code}/spring-boot-samples/spring-boot-sample-property-validation[property +validation sample] so you can see how to set things up. TIP: The `spring-boot-actuator` module includes an endpoint that exposes all `@ConfigurationProperties` beans. Simply point your web browser to `/configprops` diff --git a/spring-boot-samples/spring-boot-sample-property-validation/src/main/java/sample/propertyvalidation/SamplePropertyValidationApplication.java b/spring-boot-samples/spring-boot-sample-property-validation/src/main/java/sample/propertyvalidation/SamplePropertyValidationApplication.java index 462b0d567a4..41c536b4310 100644 --- a/spring-boot-samples/spring-boot-sample-property-validation/src/main/java/sample/propertyvalidation/SamplePropertyValidationApplication.java +++ b/spring-boot-samples/spring-boot-sample-property-validation/src/main/java/sample/propertyvalidation/SamplePropertyValidationApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,42 +16,36 @@ package sample.propertyvalidation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; import org.springframework.validation.Validator; @SpringBootApplication -public class SamplePropertyValidationApplication { +public class SamplePropertyValidationApplication implements CommandLineRunner { + + private final SampleProperties properties; + + public SamplePropertyValidationApplication(SampleProperties properties) { + this.properties = properties; + } @Bean - public Validator configurationPropertiesValidator() { + public static Validator configurationPropertiesValidator() { return new SamplePropertiesValidator(); } - @Service - @Profile("app") - static class Startup implements CommandLineRunner { - - @Autowired - private SampleProperties properties; - - @Override - public void run(String... args) { - System.out.println("========================================="); - System.out.println("Sample host: " + this.properties.getHost()); - System.out.println("Sample port: " + this.properties.getPort()); - System.out.println("========================================="); - } + @Override + public void run(String... args) { + System.out.println("========================================="); + System.out.println("Sample host: " + this.properties.getHost()); + System.out.println("Sample port: " + this.properties.getPort()); + System.out.println("========================================="); } public static void main(String[] args) throws Exception { - new SpringApplicationBuilder(SamplePropertyValidationApplication.class) - .profiles("app").run(args); + new SpringApplicationBuilder(SamplePropertyValidationApplication.class).run(args); } }