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