From 30a0ccab0286f8eac7f9c692faf9d0039fc9afa3 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 3 Nov 2020 13:01:38 +0000 Subject: [PATCH] Remove use of `@PostConstruct` from main code When running on Java 11 (where `@PostConstruct` is no longer part of the JRE) and without a dependency on jakarta-annotation-api, `@PostContruct` annotions are silently dropped. This leads to obscure and hard-to-track down changes in the behaviour of our auto-configuration as the `@PostConstruct`-annotated methods are not invoked. To allow users to run on Java 11 without having jakarta-annotation-api on the classpath, this commit removes use of `@PostConstruct` from main code. A Checkstyle rule has also been added to prevent its usage in main code from being reintroduced. Closes gh-23723 --- ...ebEndpointManagementContextConfiguration.java | 8 +++----- .../CacheMetricsRegistrarConfiguration.java | 8 +++----- .../batch/BasicBatchConfigurer.java | 12 ++++++++---- .../freemarker/FreeMarkerAutoConfiguration.java | 6 ++---- .../GroovyTemplateAutoConfiguration.java | 3 +-- ...ermediaHttpMessageConverterConfiguration.java | 12 ++++++------ .../jdbc/DataSourceJmxConfiguration.java | 7 +++---- .../jersey/JerseyAutoConfiguration.java | 16 ++-------------- .../MailSenderValidatorAutoConfiguration.java | 5 ++--- .../mustache/MustacheAutoConfiguration.java | 6 ++---- .../oauth2/client/OAuth2ClientProperties.java | 11 +++++++---- .../resource/OAuth2ResourceServerProperties.java | 13 ++++++++----- .../session/SessionAutoConfiguration.java | 15 +++++++-------- .../thymeleaf/ThymeleafAutoConfiguration.java | 7 +++---- ...SessionAutoConfigurationIntegrationTests.java | 4 ++-- .../session/SessionAutoConfigurationTests.java | 2 +- .../boot/jackson/JsonComponentModule.java | 13 ++++++++----- .../boot/jdbc/AbstractDataSourceInitializer.java | 10 +++++++--- src/checkstyle/checkstyle-suppressions.xml | 2 ++ src/checkstyle/checkstyle.xml | 9 ++++++++- 20 files changed, 85 insertions(+), 84 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java index d22961a5f62f..3d18efd431cc 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -21,8 +21,6 @@ import java.util.HashSet; import java.util.List; -import javax.annotation.PostConstruct; - import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.model.Resource; @@ -112,10 +110,10 @@ static class JerseyWebEndpointsResourcesRegistrar { this.mediaTypes = endpointMediaTypes; this.basePath = basePath; this.shouldRegisterLinks = shouldRegisterLinks; + register(); } - @PostConstruct - void register() { + private void register() { // We can't easily use @ConditionalOnBean because @AutoConfigureBefore is // not an option for management contexts. Instead we manually check if // the resource config bean exists diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/cache/CacheMetricsRegistrarConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/cache/CacheMetricsRegistrarConfiguration.java index 8c34f201cc95..d1b402ec36fb 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/cache/CacheMetricsRegistrarConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/cache/CacheMetricsRegistrarConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -19,8 +19,6 @@ import java.util.Collection; import java.util.Map; -import javax.annotation.PostConstruct; - import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; @@ -56,6 +54,7 @@ class CacheMetricsRegistrarConfiguration { this.registry = registry; this.cacheManagers = cacheManagers; this.cacheMetricsRegistrar = new CacheMetricsRegistrar(this.registry, binderProviders); + bindCachesToRegistry(); } @Bean @@ -63,8 +62,7 @@ CacheMetricsRegistrar cacheMetricsRegistrar() { return this.cacheMetricsRegistrar; } - @PostConstruct - void bindCachesToRegistry() { + private void bindCachesToRegistry() { this.cacheManagers.forEach(this::bindCacheManagerToRegistry); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java index 64e88cb72efb..c86f63893958 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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,7 +16,6 @@ package org.springframework.boot.autoconfigure.batch; -import javax.annotation.PostConstruct; import javax.sql.DataSource; import org.springframework.batch.core.configuration.annotation.BatchConfigurer; @@ -26,6 +25,7 @@ import org.springframework.batch.core.launch.support.SimpleJobLauncher; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.jdbc.datasource.DataSourceTransactionManager; @@ -40,7 +40,7 @@ * @author Stephane Nicoll * @since 1.0.0 */ -public class BasicBatchConfigurer implements BatchConfigurer { +public class BasicBatchConfigurer implements BatchConfigurer, InitializingBean { private final BatchProperties properties; @@ -90,7 +90,11 @@ public JobExplorer getJobExplorer() throws Exception { return this.jobExplorer; } - @PostConstruct + @Override + public void afterPropertiesSet() { + initialize(); + } + public void initialize() { try { this.transactionManager = buildTransactionManager(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java index 4ddd5c8a8bb1..ff3980883a6e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/freemarker/FreeMarkerAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -19,8 +19,6 @@ import java.util.ArrayList; import java.util.List; -import javax.annotation.PostConstruct; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -57,9 +55,9 @@ public class FreeMarkerAutoConfiguration { public FreeMarkerAutoConfiguration(ApplicationContext applicationContext, FreeMarkerProperties properties) { this.applicationContext = applicationContext; this.properties = properties; + checkTemplateLocationExists(); } - @PostConstruct public void checkTemplateLocationExists() { if (logger.isWarnEnabled() && this.properties.isCheckTemplateLocation()) { List locations = getLocations(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java index 7a2629ee9cbe..d2e4fe7648ad 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/groovy/template/GroovyTemplateAutoConfiguration.java @@ -19,7 +19,6 @@ import java.security.CodeSource; import java.security.ProtectionDomain; -import javax.annotation.PostConstruct; import javax.servlet.Servlet; import groovy.text.markup.MarkupTemplateEngine; @@ -77,9 +76,9 @@ public static class GroovyMarkupConfiguration { public GroovyMarkupConfiguration(ApplicationContext applicationContext, GroovyTemplateProperties properties) { this.applicationContext = applicationContext; this.properties = properties; + checkTemplateLocationExists(); } - @PostConstruct public void checkTemplateLocationExists() { if (this.properties.isCheckTemplateLocation() && !isUsingGroovyAllJar()) { TemplateLocation location = new TemplateLocation(this.properties.getResourceLoaderPath()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaHttpMessageConverterConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaHttpMessageConverterConfiguration.java index a26d0f2c9d98..1b6c3dcd1576 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaHttpMessageConverterConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/hateoas/HypermediaHttpMessageConverterConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -20,11 +20,10 @@ import java.util.Collection; import java.util.List; -import javax.annotation.PostConstruct; - import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -60,12 +59,13 @@ public static HalMessageConverterSupportedMediaTypesCustomizer halMessageConvert * {@code Jackson2ModuleRegisteringBeanPostProcessor} has registered the converter and * it is unordered. */ - private static class HalMessageConverterSupportedMediaTypesCustomizer implements BeanFactoryAware { + private static class HalMessageConverterSupportedMediaTypesCustomizer + implements BeanFactoryAware, InitializingBean { private volatile BeanFactory beanFactory; - @PostConstruct - void configureHttpMessageConverters() { + @Override + public void afterPropertiesSet() { if (this.beanFactory instanceof ListableBeanFactory) { configureHttpMessageConverters(((ListableBeanFactory) this.beanFactory) .getBeansOfType(RequestMappingHandlerAdapter.class).values()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceJmxConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceJmxConfiguration.java index 96351d9ec6d6..77c9afd872b4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceJmxConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceJmxConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -18,7 +18,6 @@ import java.sql.SQLException; -import javax.annotation.PostConstruct; import javax.sql.DataSource; import com.zaxxer.hikari.HikariDataSource; @@ -59,10 +58,10 @@ static class Hikari { Hikari(DataSource dataSource, ObjectProvider mBeanExporter) { this.dataSource = dataSource; this.mBeanExporter = mBeanExporter; + validateMBeans(); } - @PostConstruct - void validateMBeans() { + private void validateMBeans() { HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(this.dataSource, HikariDataSource.class); if (hikariDataSource != null && hikariDataSource.isRegisterMbeans()) { this.mBeanExporter.ifUnique((exporter) -> exporter.addExcludedBean("dataSource")); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java index 9011c0f2ff5b..8ce16c5d2031 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -19,7 +19,6 @@ import java.util.Collections; import java.util.EnumSet; -import javax.annotation.PostConstruct; import javax.servlet.DispatcherType; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -95,22 +94,11 @@ public class JerseyAutoConfiguration implements ServletContextAware { private final ResourceConfig config; - private final ObjectProvider customizers; - public JerseyAutoConfiguration(JerseyProperties jersey, ResourceConfig config, ObjectProvider customizers) { this.jersey = jersey; this.config = config; - this.customizers = customizers; - } - - @PostConstruct - public void path() { - customize(); - } - - private void customize() { - this.customizers.orderedStream().forEach((customizer) -> customizer.customize(this.config)); + customizers.orderedStream().forEach((customizer) -> customizer.customize(this.config)); } @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java index ff262e4fbca9..e72104819fa0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderValidatorAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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,7 +16,6 @@ package org.springframework.boot.autoconfigure.mail; -import javax.annotation.PostConstruct; import javax.mail.MessagingException; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -44,9 +43,9 @@ public class MailSenderValidatorAutoConfiguration { public MailSenderValidatorAutoConfiguration(JavaMailSenderImpl mailSender) { this.mailSender = mailSender; + validateConnection(); } - @PostConstruct public void validateConnection() { try { this.mailSender.testConnection(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheAutoConfiguration.java index 227b41280bf5..eb093acc5f1d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache/MustacheAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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,8 +16,6 @@ package org.springframework.boot.autoconfigure.mustache; -import javax.annotation.PostConstruct; - import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Mustache.Collector; import com.samskivert.mustache.Mustache.TemplateLoader; @@ -57,9 +55,9 @@ public class MustacheAutoConfiguration { public MustacheAutoConfiguration(MustacheProperties mustache, ApplicationContext applicationContext) { this.mustache = mustache; this.applicationContext = applicationContext; + checkTemplateLocationExists(); } - @PostConstruct public void checkTemplateLocationExists() { if (this.mustache.isCheckTemplateLocation()) { TemplateLocation location = new TemplateLocation(this.mustache.getPrefix()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientProperties.java index b6d6bf952f4b..0cca4d8bffa9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientProperties.java @@ -20,8 +20,7 @@ import java.util.Map; import java.util.Set; -import javax.annotation.PostConstruct; - +import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.util.StringUtils; @@ -35,7 +34,7 @@ * @since 2.0.0 */ @ConfigurationProperties(prefix = "spring.security.oauth2.client") -public class OAuth2ClientProperties { +public class OAuth2ClientProperties implements InitializingBean { /** * OAuth provider details. @@ -55,7 +54,11 @@ public Map getRegistration() { return this.registration; } - @PostConstruct + @Override + public void afterPropertiesSet() { + validate(); + } + public void validate() { this.getRegistration().values().forEach(this::validateRegistration); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties.java index fe6eff975d75..2e0dd17e0579 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/OAuth2ResourceServerProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -19,8 +19,7 @@ import java.io.InputStream; import java.nio.charset.StandardCharsets; -import javax.annotation.PostConstruct; - +import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException; import org.springframework.core.io.Resource; @@ -35,7 +34,7 @@ * @since 2.1.0 */ @ConfigurationProperties(prefix = "spring.security.oauth2.resourceserver") -public class OAuth2ResourceServerProperties { +public class OAuth2ResourceServerProperties implements InitializingBean { private final Jwt jwt = new Jwt(); @@ -49,7 +48,11 @@ public Opaquetoken getOpaquetoken() { return this.opaqueToken; } - @PostConstruct + @Override + public void afterPropertiesSet() throws Exception { + validate(); + } + public void validate() { if (this.getOpaquetoken().getIntrospectionUri() != null) { if (this.getJwt().getJwkSetUri() != null) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java index ea9e253b42fd..e667a89da19e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -21,8 +21,7 @@ import java.util.List; import java.util.Locale; -import javax.annotation.PostConstruct; - +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -226,10 +225,10 @@ abstract static class AbstractSessionRepositoryImplementationValidator { this.classLoader = applicationContext.getClassLoader(); this.sessionProperties = sessionProperties; this.candidates = candidates; + checkAvailableImplementations(); } - @PostConstruct - void checkAvailableImplementations() { + private void checkAvailableImplementations() { List> availableCandidates = new ArrayList<>(); for (String candidate : this.candidates) { addCandidateIfAvailable(availableCandidates, candidate); @@ -291,7 +290,7 @@ static class ReactiveSessionRepositoryImplementationValidator /** * Base class for validating that a (reactive) session repository bean exists. */ - abstract static class AbstractSessionRepositoryValidator { + abstract static class AbstractSessionRepositoryValidator implements InitializingBean { private final SessionProperties sessionProperties; @@ -303,8 +302,8 @@ protected AbstractSessionRepositoryValidator(SessionProperties sessionProperties this.sessionRepositoryProvider = sessionRepositoryProvider; } - @PostConstruct - void checkSessionRepository() { + @Override + public void afterPropertiesSet() { StoreType storeType = this.sessionProperties.getStoreType(); if (storeType != StoreType.NONE && this.sessionRepositoryProvider.getIfAvailable() == null && storeType != null) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java index b1ab53974b38..cbe75645ad73 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -18,7 +18,6 @@ import java.util.LinkedHashMap; -import javax.annotation.PostConstruct; import javax.servlet.DispatcherType; import com.github.mxab.thymeleaf.extras.dataattribute.dialect.DataAttributeDialect; @@ -95,10 +94,10 @@ static class DefaultTemplateResolverConfiguration { DefaultTemplateResolverConfiguration(ThymeleafProperties properties, ApplicationContext applicationContext) { this.properties = properties; this.applicationContext = applicationContext; + checkTemplateLocationExists(); } - @PostConstruct - void checkTemplateLocationExists() { + private void checkTemplateLocationExists() { boolean checkTemplateLocation = this.properties.isCheckTemplateLocation(); if (checkTemplateLocation) { TemplateLocation location = new TemplateLocation(this.properties.getPrefix()); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationIntegrationTests.java index d4d1287b8645..6ab589363761 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -48,7 +48,7 @@ class SessionAutoConfigurationIntegrationTests extends AbstractSessionAutoConfig void severalCandidatesWithNoSessionStore() { this.contextRunner.withUserConfiguration(HazelcastConfiguration.class).run((context) -> { assertThat(context).hasFailed(); - assertThat(context).getFailure().hasCauseInstanceOf(NonUniqueSessionRepositoryException.class); + assertThat(context).getFailure().hasRootCauseInstanceOf(NonUniqueSessionRepositoryException.class); assertThat(context).getFailure() .hasMessageContaining("Multiple session repository candidates are available"); assertThat(context).getFailure() diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java index c7e30efaab2b..808842f42213 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java @@ -62,7 +62,7 @@ class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurationTest void contextFailsIfMultipleStoresAreAvailable() { this.contextRunner.run((context) -> { assertThat(context).hasFailed(); - assertThat(context).getFailure().hasCauseInstanceOf(NonUniqueSessionRepositoryException.class); + assertThat(context).getFailure().hasRootCauseInstanceOf(NonUniqueSessionRepositoryException.class); assertThat(context).getFailure() .hasMessageContaining("Multiple session repository candidates are available"); }); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java index 1d620a1f1af9..2194403f48ba 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -20,8 +20,6 @@ import java.util.Map; import java.util.function.BiConsumer; -import javax.annotation.PostConstruct; - import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.KeyDeserializer; @@ -33,6 +31,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.HierarchicalBeanFactory; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.boot.jackson.JsonComponent.Scope; import org.springframework.core.ResolvableType; @@ -51,7 +50,7 @@ * @since 1.4.0 * @see JsonComponent */ -public class JsonComponentModule extends SimpleModule implements BeanFactoryAware { +public class JsonComponentModule extends SimpleModule implements BeanFactoryAware, InitializingBean { private BeanFactory beanFactory; @@ -60,7 +59,11 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } - @PostConstruct + @Override + public void afterPropertiesSet() { + registerJsonComponents(); + } + public void registerJsonComponents() { BeanFactory beanFactory = this.beanFactory; while (beanFactory != null) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/AbstractDataSourceInitializer.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/AbstractDataSourceInitializer.java index 07195ff874e5..9c7b39427fe4 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/AbstractDataSourceInitializer.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jdbc/AbstractDataSourceInitializer.java @@ -18,9 +18,9 @@ import java.sql.DatabaseMetaData; -import javax.annotation.PostConstruct; import javax.sql.DataSource; +import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.ResourceLoader; import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; @@ -35,7 +35,7 @@ * @author Stephane Nicoll * @since 1.5.0 */ -public abstract class AbstractDataSourceInitializer { +public abstract class AbstractDataSourceInitializer implements InitializingBean { private static final String PLATFORM_PLACEHOLDER = "@@platform@@"; @@ -50,7 +50,11 @@ protected AbstractDataSourceInitializer(DataSource dataSource, ResourceLoader re this.resourceLoader = resourceLoader; } - @PostConstruct + @Override + public void afterPropertiesSet() { + initialize(); + } + protected void initialize() { if (!isEnabled()) { return; diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index 588c5a62fa61..3d68bb86c7dc 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -13,12 +13,14 @@ + + diff --git a/src/checkstyle/checkstyle.xml b/src/checkstyle/checkstyle.xml index df3dcc9c29e4..5d952a0cc23b 100644 --- a/src/checkstyle/checkstyle.xml +++ b/src/checkstyle/checkstyle.xml @@ -15,7 +15,14 @@ + value="^com\.hazelcast\.util\.Base64, ^org\.junit\.rules\.ExpectedException, ^org\.mockito\.InjectMocks, ^org\.slf4j\.LoggerFactory, ^org.springframework.context.annotation.ScannedGenericBeanDefinition, ^reactor\.core\.support\.Assert"/> + + + + +