diff --git a/spring-data-jdbc/src/main/resources/META-INF/spring.factories b/spring-data-jdbc/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..f244d7b51 --- /dev/null +++ b/spring-data-jdbc/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.data.repository.core.support.RepositoryFactorySupport=org.springframework.data.jdbc.repository.support.JdbcRepositoryFactory diff --git a/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java b/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java index 1bc36a4e1..002108f59 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java +++ b/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java @@ -15,9 +15,13 @@ */ package org.springframework.data.jdbc.repository.config; +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Collections; import java.util.Locale; import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean; +import org.springframework.data.relational.core.mapping.Table; import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport; /** @@ -55,4 +59,11 @@ public class JdbcRepositoryConfigExtension extends RepositoryConfigurationExtens return getModuleName().toLowerCase(Locale.US); } + /** + * In strict mode only domain types having a {@link Table} annotation get a repository. + */ + @Override + protected Collection> getIdentifyingAnnotations() { + return Collections.singleton(Table.class); + } } diff --git a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java index 05e164b78..8676ac1de 100644 --- a/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java +++ b/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java @@ -106,7 +106,7 @@ public class JdbcRepositoryFactory extends RepositoryFactorySupport { JdbcAggregateTemplate template = new JdbcAggregateTemplate(publisher, context, converter, accessStrategy); - return new SimpleJdbcRepository<>(template, context.getPersistentEntity(repositoryInformation.getDomainType())); + return new SimpleJdbcRepository<>(template, context.getRequiredPersistentEntity(repositoryInformation.getDomainType())); } /* diff --git a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java index b1bd895bf..b798470e5 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.data.annotation.Id; import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories; diff --git a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java index 9f5500d56..2a6787ad7 100644 --- a/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java +++ b/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java @@ -34,7 +34,9 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.Import; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceConstructor; diff --git a/src/test/java/org/springframework/data/relational/repository/config/JdbcRepositoryConfigExtensionUnitTests.java b/src/test/java/org/springframework/data/relational/repository/config/JdbcRepositoryConfigExtensionUnitTests.java new file mode 100644 index 000000000..7805fa2d0 --- /dev/null +++ b/src/test/java/org/springframework/data/relational/repository/config/JdbcRepositoryConfigExtensionUnitTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2019 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.data.jdbc.repository.config; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Collection; + +import org.junit.Test; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.core.env.Environment; +import org.springframework.core.env.StandardEnvironment; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.type.StandardAnnotationMetadata; +import org.springframework.data.relational.core.mapping.Table; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.config.AnnotationRepositoryConfigurationSource; +import org.springframework.data.repository.config.RepositoryConfiguration; +import org.springframework.data.repository.config.RepositoryConfigurationSource; + +/** + * Unit tests for {@link JdbcRepositoryConfigExtension}. + * + * @author Jens Schauder + */ +public class JdbcRepositoryConfigExtensionUnitTests { + + StandardAnnotationMetadata metadata = new StandardAnnotationMetadata(Config.class, true); + ResourceLoader loader = new PathMatchingResourcePatternResolver(); + Environment environment = new StandardEnvironment(); + BeanDefinitionRegistry registry = new DefaultListableBeanFactory(); + + RepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, + EnableJdbcRepositories.class, loader, environment, registry); + + @Test // DATAJPA-437 + public void isStrictMatchOnlyIfDomainTypeIsAnnotatedWithDocument() { + + JdbcRepositoryConfigExtension extension = new JdbcRepositoryConfigExtension(); + + Collection> configs = extension + .getRepositoryConfigurations(configurationSource, loader, true); + + assertThat(configs).extracting(config -> config.getRepositoryInterface()) + .containsExactly(SampleRepository.class.getName()); + } + + @EnableJdbcRepositories(considerNestedRepositories = true) + static class Config { + + } + + @Table + static class Sample {} + + interface SampleRepository extends Repository {} + + static class Unannotated {} + + interface UnannotatedRepository extends Repository {} +}