diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerProperties.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerProperties.java index 6b87ecce63..af60c3602d 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerProperties.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/ManagementServerProperties.java @@ -20,8 +20,8 @@ import java.net.InetAddress; import java.util.Arrays; import java.util.List; +import javax.annotation.PostConstruct; import javax.servlet.http.HttpSession; -import javax.validation.constraints.NotNull; import org.springframework.boot.autoconfigure.security.SecurityPrerequisite; import org.springframework.boot.autoconfigure.security.SecurityProperties; @@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.embedded.Ssl; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** @@ -78,7 +79,6 @@ public class ManagementServerProperties implements SecurityPrerequisite { /** * Management endpoint context-path. */ - @NotNull private String contextPath = ""; /** @@ -88,6 +88,11 @@ public class ManagementServerProperties implements SecurityPrerequisite { private final Security security = new Security(); + @PostConstruct + private void validate() { + Assert.notNull(this.contextPath, "ContextPath must not be null"); + } + /** * Returns the management port or {@code null} if the * {@link ServerProperties#getPort() server port} should be used. diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java index 0eb7d2d86a..5e0ff14a8e 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java @@ -16,11 +16,13 @@ package org.springframework.boot.actuate.endpoint; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import java.util.regex.Pattern; + +import javax.annotation.PostConstruct; import org.springframework.context.EnvironmentAware; import org.springframework.core.env.Environment; +import org.springframework.util.Assert; /** * Abstract base for {@link Endpoint} implementations. @@ -31,14 +33,14 @@ import org.springframework.core.env.Environment; */ public abstract class AbstractEndpoint implements Endpoint, EnvironmentAware { + private static final Pattern ID_PATTERN = Pattern.compile("\\w+"); + private Environment environment; /** * Endpoint identifier. With HTTP monitoring the identifier of the endpoint is mapped * to a URL (e.g. 'foo' is mapped to '/foo'). */ - @NotNull - @Pattern(regexp = "\\w+", message = "ID must only contains letters, numbers and '_'") private String id; private final boolean sensitiveDefault; @@ -53,6 +55,13 @@ public abstract class AbstractEndpoint implements Endpoint, EnvironmentAwa */ private Boolean enabled; + @PostConstruct + private void validate() { + Assert.notNull(this.id, "Id must not be null"); + Assert.isTrue(ID_PATTERN.matcher(this.id).matches(), + "ID must only contains letters, numbers and '_'"); + } + /** * Create a new sensitive endpoint instance. The endpoint will enabled flag will be * based on the spring {@link Environment} unless explicitly set. diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/LiquibaseEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/LiquibaseEndpoint.java index 99c4f64251..37fd90a99f 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/LiquibaseEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/LiquibaseEndpoint.java @@ -62,9 +62,11 @@ public class LiquibaseEndpoint extends AbstractEndpoint> { for (Map.Entry entry : this.liquibases.entrySet()) { try { DataSource dataSource = entry.getValue().getDataSource(); - JdbcConnection connection = new JdbcConnection(dataSource.getConnection()); + JdbcConnection connection = new JdbcConnection( + dataSource.getConnection()); try { - Database database = factory.findCorrectDatabaseImplementation(connection); + Database database = factory + .findCorrectDatabaseImplementation(connection); reports.add(new LiquibaseReport(entry.getKey(), service.queryDatabaseChangeLogTable(database))); } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/AbstractMvcEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/AbstractMvcEndpoint.java index bd1abcd6ee..329827d9ff 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/AbstractMvcEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/AbstractMvcEndpoint.java @@ -16,13 +16,13 @@ package org.springframework.boot.actuate.endpoint.mvc; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.annotation.PostConstruct; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.EndpointProperties; import org.springframework.context.EnvironmentAware; import org.springframework.core.env.Environment; +import org.springframework.util.Assert; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** @@ -41,8 +41,6 @@ public abstract class AbstractMvcEndpoint extends WebMvcConfigurerAdapter /** * Endpoint URL path. */ - @NotNull - @Pattern(regexp = "/.*|^$", message = "Path must start with / or be empty") private String path; /** @@ -68,6 +66,13 @@ public abstract class AbstractMvcEndpoint extends WebMvcConfigurerAdapter this.enabled = enabled; } + @PostConstruct + private void validate() { + Assert.notNull(this.path, "Path must not be null"); + Assert.isTrue(this.path.length() == 0 || this.path.startsWith("/"), + "Path must start with / or be empty"); + } + @Override public void setEnvironment(Environment environment) { this.environment = environment; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java index d503f79e05..7fc6809a17 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java @@ -37,10 +37,11 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class FlywayProperties { /** - * Locations of migrations scripts. Can contain the special "{vendor}" placeholder - * to use vendor-specific locations. + * Locations of migrations scripts. Can contain the special "{vendor}" placeholder to + * use vendor-specific locations. */ - private List locations = new ArrayList(Collections.singletonList("db/migration")); + private List locations = new ArrayList( + Collections.singletonList("db/migration")); /** * Check that migration scripts location exists. diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/h2/H2ConsoleProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/h2/H2ConsoleProperties.java index a4827c0be8..758d0bd029 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/h2/H2ConsoleProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/h2/H2ConsoleProperties.java @@ -16,10 +16,10 @@ package org.springframework.boot.autoconfigure.h2; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.annotation.PostConstruct; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.util.Assert; /** * Configuration properties for H2's console. @@ -35,8 +35,6 @@ public class H2ConsoleProperties { /** * Path at which the console will be available. */ - @NotNull - @Pattern(regexp = "/[^?#]*", message = "Path must start with /") private String path = "/h2-console"; /** @@ -46,6 +44,13 @@ public class H2ConsoleProperties { private final Settings settings = new Settings(); + @PostConstruct + private void validate() { + Assert.notNull(this.path, "Path must not be null"); + Assert.isTrue(this.path.length() == 0 || this.path.startsWith("/"), + "Path must start with / or be empty"); + } + public String getPath() { return this.path; } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseProperties.java index 14a92ea920..42b5726647 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/liquibase/LiquibaseProperties.java @@ -19,11 +19,12 @@ package org.springframework.boot.autoconfigure.liquibase; import java.io.File; import java.util.Map; -import javax.validation.constraints.NotNull; +import javax.annotation.PostConstruct; import liquibase.integration.spring.SpringLiquibase; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.util.Assert; /** * Configuration properties to configure {@link SpringLiquibase}. @@ -37,7 +38,6 @@ public class LiquibaseProperties { /** * Change log configuration path. */ - @NotNull private String changeLog = "classpath:/db/changelog/db.changelog-master.yaml"; /** @@ -96,6 +96,11 @@ public class LiquibaseProperties { */ private File rollbackFile; + @PostConstruct + private void validate() { + Assert.notNull(this.changeLog, "ChangeLog must not be null"); + } + public String getChangeLog() { return this.changeLog; } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java index a7def07eed..98179cf681 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java @@ -26,11 +26,11 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.PostConstruct; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.SessionCookieConfig; import javax.servlet.SessionTrackingMode; -import javax.validation.constraints.NotNull; import io.undertow.Undertow.Builder; import io.undertow.UndertowOptions; @@ -74,6 +74,7 @@ import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.context.EnvironmentAware; import org.springframework.core.Ordered; import org.springframework.core.env.Environment; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -122,7 +123,6 @@ public class ServerProperties /** * Path of the main dispatcher servlet. */ - @NotNull private String servletPath = "/"; /** @@ -176,6 +176,11 @@ public class ServerProperties private Environment environment; + @PostConstruct + private void validate() { + Assert.notNull(this.servletPath, "ServletPath must not be null"); + } + @Override public int getOrder() { return 0; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesProperties.java index 187b3d2512..83220c0684 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/webservices/WebServicesProperties.java @@ -19,10 +19,10 @@ package org.springframework.boot.autoconfigure.webservices; import java.util.HashMap; import java.util.Map; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; +import javax.annotation.PostConstruct; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.util.Assert; /** * {@link ConfigurationProperties} for Spring Web Services. @@ -37,12 +37,17 @@ public class WebServicesProperties { /** * Path that serves as the base URI for the services. */ - @NotNull - @Pattern(regexp = "/[^?#]*", message = "Path must start with /") private String path = "/services"; private final Servlet servlet = new Servlet(); + @PostConstruct + private void validate() { + Assert.notNull(this.path, "Path must not be null"); + Assert.isTrue(this.path.length() == 0 || this.path.startsWith("/"), + "Path must start with / or be empty"); + } + public String getPath() { return this.path; }