diff --git a/spring-boot-project/spring-boot-autoconfigure/build.gradle b/spring-boot-project/spring-boot-autoconfigure/build.gradle index f3dbe04e79..c73078e9c3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/build.gradle +++ b/spring-boot-project/spring-boot-autoconfigure/build.gradle @@ -113,6 +113,7 @@ dependencies { optional("org.springframework.batch:spring-batch-core") optional("org.springframework.data:spring-data-couchbase") optional("org.springframework.data:spring-data-jpa") + optional("org.springframework.data:spring-data-envers") optional("org.springframework.data:spring-data-rest-webmvc") optional("org.springframework.data:spring-data-cassandra") optional("org.springframework.data:spring-data-elasticsearch") { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/EnversRevisionRepositoriesRegistrar.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/EnversRevisionRepositoriesRegistrar.java new file mode 100644 index 0000000000..657db930d8 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/EnversRevisionRepositoriesRegistrar.java @@ -0,0 +1,41 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.jpa; + +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +/** + * {@link ImportBeanDefinitionRegistrar} used to auto-configure Spring Data Envers + * Repositories. + * + * @author Stefano Cordio + */ +class EnversRevisionRepositoriesRegistrar extends JpaRepositoriesRegistrar { + + @Override + protected Class getConfiguration() { + return EnableJpaRepositoriesConfiguration.class; + } + + @EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class) + private static class EnableJpaRepositoriesConfiguration { + + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java index be992aeee0..20e9156a3c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java @@ -26,6 +26,7 @@ import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilderCustomizer; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; @@ -35,10 +36,13 @@ import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.data.envers.repository.config.EnableEnversRepositories; +import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension; import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; +import org.springframework.data.repository.history.RevisionRepository; /** * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's JPA Repositories. @@ -50,11 +54,17 @@ import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; * Once in effect, the auto-configuration is the equivalent of enabling JPA repositories * using the {@link EnableJpaRepositories @EnableJpaRepositories} annotation. *

+ * In case {@link EnableEnversRepositories} is on the classpath, + * {@link EnversRevisionRepositoryFactoryBean} is used instead of + * {@link JpaRepositoryFactoryBean} to support {@link RevisionRepository} with Hibernate + * Envers. + *

* This configuration class will activate after the Hibernate auto-configuration. * * @author Phillip Webb * @author Josh Long * @author Scott Frederick + * @author Stefano Cordio * @since 1.0.0 * @see EnableJpaRepositories */ @@ -64,7 +74,6 @@ import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; @ConditionalOnMissingBean({ JpaRepositoryFactoryBean.class, JpaRepositoryConfigExtension.class }) @ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true) -@Import(JpaRepositoriesRegistrar.class) @AutoConfigureAfter({ HibernateJpaAutoConfiguration.class, TaskExecutionAutoConfiguration.class }) public class JpaRepositoriesAutoConfiguration { @@ -106,4 +115,18 @@ public class JpaRepositoriesAutoConfiguration { } + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass(EnableEnversRepositories.class) + @Import(EnversRevisionRepositoriesRegistrar.class) + public static class EnversRevisionRepositoriesRegistrarConfiguration { + + } + + @Configuration(proxyBeanMethods = false) + @ConditionalOnMissingClass("org.springframework.data.envers.repository.config.EnableEnversRepositories") + @Import(JpaRepositoriesRegistrar.class) + public static class JpaRepositoriesRegistrarConfiguration { + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/AbstractJpaRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/AbstractJpaRepositoriesAutoConfigurationTests.java new file mode 100644 index 0000000000..4c4a9efc1d --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/AbstractJpaRepositoriesAutoConfigurationTests.java @@ -0,0 +1,187 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.jpa; + +import javax.persistence.EntityManagerFactory; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.data.alt.elasticsearch.CityElasticsearchDbRepository; +import org.springframework.boot.autoconfigure.data.alt.jpa.CityJpaRepository; +import org.springframework.boot.autoconfigure.data.alt.mongo.CityMongoDbRepository; +import org.springframework.boot.autoconfigure.data.jpa.city.City; +import org.springframework.boot.autoconfigure.data.jpa.city.CityRepository; +import org.springframework.boot.autoconfigure.data.jpa.country.Country; +import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; +import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; +import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; +import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan.Filter; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.Import; +import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.PlatformTransactionManager; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Base class for {@link JpaRepositoriesAutoConfiguration} tests. + * + * @author Dave Syer + * @author Oliver Gierke + * @author Scott Frederick + * @author Stefano Cordio + */ +abstract class AbstractJpaRepositoriesAutoConfigurationTests { + + final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(HibernateJpaAutoConfiguration.class, + JpaRepositoriesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class)) + .withUserConfiguration(EmbeddedDataSourceConfiguration.class); + + @Test + void testDefaultRepositoryConfiguration() { + this.contextRunner.withUserConfiguration(TestConfiguration.class).run((context) -> { + assertThat(context).hasSingleBean(CityRepository.class); + assertThat(context).hasSingleBean(PlatformTransactionManager.class); + assertThat(context).hasSingleBean(EntityManagerFactory.class); + assertThat(context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull(); + }); + } + + @Test + void testOverrideRepositoryConfiguration() { + this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> { + assertThat(context).hasSingleBean(CityJpaRepository.class); + assertThat(context).hasSingleBean(PlatformTransactionManager.class); + assertThat(context).hasSingleBean(EntityManagerFactory.class); + }); + } + + @Test + void autoConfigurationShouldNotKickInEvenIfManualConfigDidNotCreateAnyRepositories() { + this.contextRunner.withUserConfiguration(SortOfInvalidCustomConfiguration.class) + .run((context) -> assertThat(context).doesNotHaveBean(CityRepository.class)); + } + + @Test + void whenBootstrapModeIsLazyWithMultipleAsyncExecutorBootstrapExecutorIsConfigured() { + this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) + .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, + TaskSchedulingAutoConfiguration.class)) + .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=lazy") + .run((context) -> assertThat( + context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) + .isEqualTo(context.getBean("applicationTaskExecutor"))); + } + + @Test + void whenBootstrapModeIsLazyWithSingleAsyncExecutorBootstrapExecutorIsConfigured() { + this.contextRunner.withUserConfiguration(SingleAsyncTaskExecutorConfiguration.class) + .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=lazy") + .run((context) -> assertThat( + context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) + .isEqualTo(context.getBean("testAsyncTaskExecutor"))); + } + + @Test + void whenBootstrapModeIsDeferredBootstrapExecutorIsConfigured() { + this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) + .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, + TaskSchedulingAutoConfiguration.class)) + .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=deferred") + .run((context) -> assertThat( + context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) + .isEqualTo(context.getBean("applicationTaskExecutor"))); + } + + @Test + void whenBootstrapModeIsDefaultBootstrapExecutorIsNotConfigured() { + this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) + .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, + TaskSchedulingAutoConfiguration.class)) + .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=default").run((context) -> assertThat( + context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull()); + } + + @Test + void bootstrapModeIsDefaultByDefault() { + this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) + .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, + TaskSchedulingAutoConfiguration.class)) + .run((context) -> assertThat( + context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull()); + } + + @Configuration(proxyBeanMethods = false) + @EnableScheduling + @Import(TestConfiguration.class) + static class MultipleAsyncTaskExecutorConfiguration { + + } + + @Configuration(proxyBeanMethods = false) + @Import(TestConfiguration.class) + static class SingleAsyncTaskExecutorConfiguration { + + @Bean + SimpleAsyncTaskExecutor testAsyncTaskExecutor() { + return new SimpleAsyncTaskExecutor(); + } + + } + + @Configuration(proxyBeanMethods = false) + @TestAutoConfigurationPackage(City.class) + static class TestConfiguration { + + } + + @Configuration(proxyBeanMethods = false) + @EnableJpaRepositories( + basePackageClasses = org.springframework.boot.autoconfigure.data.alt.jpa.CityJpaRepository.class, + excludeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = CityMongoDbRepository.class), + @Filter(type = FilterType.ASSIGNABLE_TYPE, value = CityElasticsearchDbRepository.class) }) + @TestAutoConfigurationPackage(City.class) + static class CustomConfiguration { + + } + + @Configuration(proxyBeanMethods = false) + // To not find any repositories + @EnableJpaRepositories("foo.bar") + @TestAutoConfigurationPackage(City.class) + static class SortOfInvalidCustomConfiguration { + + } + + @Configuration(proxyBeanMethods = false) + @TestAutoConfigurationPackage(Country.class) + static class RevisionRepositoryConfiguration { + + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/EnversRevisionRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/EnversRevisionRepositoriesAutoConfigurationTests.java new file mode 100644 index 0000000000..363f514d9b --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/EnversRevisionRepositoriesAutoConfigurationTests.java @@ -0,0 +1,39 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.jpa; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.data.jpa.country.CountryRepository; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link JpaRepositoriesAutoConfiguration} with Spring Data Envers on the + * classpath. + * + * @author Stefano Cordio + */ +class EnversRevisionRepositoriesAutoConfigurationTests extends AbstractJpaRepositoriesAutoConfigurationTests { + + @Test + void autoConfigurationShouldSucceedWithRevisionRepository() { + this.contextRunner.withUserConfiguration(RevisionRepositoryConfiguration.class) + .run((context) -> assertThat(context).hasSingleBean(CountryRepository.class)); + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java index c25490bd50..aba1c28470 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 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,164 +16,26 @@ package org.springframework.boot.autoconfigure.data.jpa; -import javax.persistence.EntityManagerFactory; - import org.junit.jupiter.api.Test; -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; -import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.autoconfigure.data.alt.elasticsearch.CityElasticsearchDbRepository; -import org.springframework.boot.autoconfigure.data.alt.jpa.CityJpaRepository; -import org.springframework.boot.autoconfigure.data.alt.mongo.CityMongoDbRepository; -import org.springframework.boot.autoconfigure.data.jpa.city.City; -import org.springframework.boot.autoconfigure.data.jpa.city.CityRepository; -import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; -import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; -import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; -import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan.Filter; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.Import; -import org.springframework.core.task.SimpleAsyncTaskExecutor; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.boot.testsupport.classpath.ClassPathExclusions; import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link JpaRepositoriesAutoConfiguration}. + * Tests for {@link JpaRepositoriesAutoConfiguration} without Spring Data Envers on the + * classpath. * - * @author Dave Syer - * @author Oliver Gierke - * @author Scott Frederick + * @author Stefano Cordio */ -class JpaRepositoriesAutoConfigurationTests { - - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(HibernateJpaAutoConfiguration.class, - JpaRepositoriesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class)) - .withUserConfiguration(EmbeddedDataSourceConfiguration.class); - - @Test - void testDefaultRepositoryConfiguration() { - this.contextRunner.withUserConfiguration(TestConfiguration.class).run((context) -> { - assertThat(context).hasSingleBean(CityRepository.class); - assertThat(context).hasSingleBean(PlatformTransactionManager.class); - assertThat(context).hasSingleBean(EntityManagerFactory.class); - assertThat(context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull(); - }); - } - - @Test - void testOverrideRepositoryConfiguration() { - this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> { - assertThat(context).hasSingleBean(CityJpaRepository.class); - assertThat(context).hasSingleBean(PlatformTransactionManager.class); - assertThat(context).hasSingleBean(EntityManagerFactory.class); - }); - } - - @Test - void autoConfigurationShouldNotKickInEvenIfManualConfigDidNotCreateAnyRepositories() { - this.contextRunner.withUserConfiguration(SortOfInvalidCustomConfiguration.class) - .run((context) -> assertThat(context).doesNotHaveBean(CityRepository.class)); - } - - @Test - void whenBootstrapModeIsLazyWithMultipleAsyncExecutorBootstrapExecutorIsConfigured() { - this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) - .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, - TaskSchedulingAutoConfiguration.class)) - .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=lazy") - .run((context) -> assertThat( - context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) - .isEqualTo(context.getBean("applicationTaskExecutor"))); - } - - @Test - void whenBootstrapModeIsLazyWithSingleAsyncExecutorBootstrapExecutorIsConfigured() { - this.contextRunner.withUserConfiguration(SingleAsyncTaskExecutorConfiguration.class) - .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=lazy") - .run((context) -> assertThat( - context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) - .isEqualTo(context.getBean("testAsyncTaskExecutor"))); - } - - @Test - void whenBootstrapModeIsDeferredBootstrapExecutorIsConfigured() { - this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) - .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, - TaskSchedulingAutoConfiguration.class)) - .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=deferred") - .run((context) -> assertThat( - context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) - .isEqualTo(context.getBean("applicationTaskExecutor"))); - } +@ClassPathExclusions("spring-data-envers-*.jar") +class JpaRepositoriesAutoConfigurationTests extends AbstractJpaRepositoriesAutoConfigurationTests { @Test - void whenBootstrapModeIsDefaultBootstrapExecutorIsNotConfigured() { - this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) - .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, - TaskSchedulingAutoConfiguration.class)) - .withPropertyValues("spring.data.jpa.repositories.bootstrap-mode=default").run((context) -> assertThat( - context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull()); - } - - @Test - void bootstrapModeIsDefaultByDefault() { - this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) - .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, - TaskSchedulingAutoConfiguration.class)) - .run((context) -> assertThat( - context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull()); - } - - @Configuration(proxyBeanMethods = false) - @EnableScheduling - @Import(TestConfiguration.class) - static class MultipleAsyncTaskExecutorConfiguration { - - } - - @Configuration(proxyBeanMethods = false) - @Import(TestConfiguration.class) - static class SingleAsyncTaskExecutorConfiguration { - - @Bean - SimpleAsyncTaskExecutor testAsyncTaskExecutor() { - return new SimpleAsyncTaskExecutor(); - } - - } - - @Configuration(proxyBeanMethods = false) - @TestAutoConfigurationPackage(City.class) - static class TestConfiguration { - - } - - @Configuration(proxyBeanMethods = false) - @EnableJpaRepositories( - basePackageClasses = org.springframework.boot.autoconfigure.data.alt.jpa.CityJpaRepository.class, - excludeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = CityMongoDbRepository.class), - @Filter(type = FilterType.ASSIGNABLE_TYPE, value = CityElasticsearchDbRepository.class) }) - @TestAutoConfigurationPackage(City.class) - static class CustomConfiguration { - - } - - @Configuration(proxyBeanMethods = false) - // To not find any repositories - @EnableJpaRepositories("foo.bar") - @TestAutoConfigurationPackage(City.class) - static class SortOfInvalidCustomConfiguration { - + void autoConfigurationShouldFailWithRevisionRepository() { + this.contextRunner.withUserConfiguration(RevisionRepositoryConfiguration.class) + .run((context) -> assertThat(context).getFailure().isInstanceOf(BeanCreationException.class)); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/City.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/City.java index 22d9a9c3a2..a851be0648 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/City.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/City.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. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/CityRepository.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/CityRepository.java index 5180e96a9c..cf19c7046d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/CityRepository.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/city/CityRepository.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. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/country/Country.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/country/Country.java new file mode 100644 index 0000000000..c0e92d24f9 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/country/Country.java @@ -0,0 +1,57 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.jpa.country; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.hibernate.envers.Audited; + +@Entity +public class Country implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue + private Long id; + + @Audited + @Column + private String name; + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/country/CountryRepository.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/country/CountryRepository.java new file mode 100644 index 0000000000..9b116814c1 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/country/CountryRepository.java @@ -0,0 +1,24 @@ +/* + * 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.jpa.country; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.history.RevisionRepository; + +public interface CountryRepository extends JpaRepository, RevisionRepository { + +}