diff --git a/pom.xml b/pom.xml index 87b7e95ebe..d972b6798e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-relational-parent - 1.2.0.BUILD-SNAPSHOT + 1.2.0.DATAJDBC-437-SNAPSHOT pom Spring Data Relational Parent diff --git a/spring-data-jdbc-distribution/pom.xml b/spring-data-jdbc-distribution/pom.xml index f2bbb72319..71c531216f 100644 --- a/spring-data-jdbc-distribution/pom.xml +++ b/spring-data-jdbc-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 1.2.0.BUILD-SNAPSHOT + 1.2.0.DATAJDBC-437-SNAPSHOT ../pom.xml diff --git a/spring-data-jdbc/pom.xml b/spring-data-jdbc/pom.xml index 0904eb8136..93ca35b98c 100644 --- a/spring-data-jdbc/pom.xml +++ b/spring-data-jdbc/pom.xml @@ -5,7 +5,7 @@ 4.0.0 spring-data-jdbc - 1.2.0.BUILD-SNAPSHOT + 1.2.0.DATAJDBC-437-SNAPSHOT Spring Data JDBC Spring Data module for JDBC repositories. @@ -14,7 +14,7 @@ org.springframework.data spring-data-relational-parent - 1.2.0.BUILD-SNAPSHOT + 1.2.0.DATAJDBC-437-SNAPSHOT diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java index b860a8204d..31100661f8 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtension.java @@ -15,10 +15,14 @@ */ 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.beans.factory.support.BeanDefinitionBuilder; import org.springframework.data.jdbc.repository.support.JdbcRepositoryFactoryBean; +import org.springframework.data.relational.core.mapping.Table; import org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport; import org.springframework.data.repository.config.RepositoryConfigurationSource; import org.springframework.util.StringUtils; @@ -75,4 +79,12 @@ public void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSo .filter(StringUtils::hasText) // .ifPresent(s -> builder.addPropertyReference("dataAccessStrategy", s)); } + + /** + * 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/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java index 165463d865..bcde8cd6d8 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/JdbcRepositoryFactory.java @@ -120,7 +120,7 @@ protected Object getTargetRepository(RepositoryInformation repositoryInformation JdbcAggregateTemplate template = new JdbcAggregateTemplate(publisher, context, converter, accessStrategy); SimpleJdbcRepository repository = new SimpleJdbcRepository<>(template, - context.getPersistentEntity(repositoryInformation.getDomainType())); + context.getRequiredPersistentEntity(repositoryInformation.getDomainType())); if (entityCallbacks != null) { template.setEntityCallbacks(entityCallbacks); 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 0000000000..f244d7b51f --- /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/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCrossAggregateHsqlIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCrossAggregateHsqlIntegrationTests.java index 7b654486cb..300b00b8b6 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCrossAggregateHsqlIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryCrossAggregateHsqlIntegrationTests.java @@ -15,7 +15,7 @@ */ package org.springframework.data.jdbc.repository; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import org.junit.ClassRule; import org.junit.Rule; diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java index 7b3d2a2401..07a864ddb5 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIdGenerationIntegrationTests.java @@ -31,6 +31,7 @@ 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/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java index d14b27e93b..e61f1f991c 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryManipulateDbActionsIntegrationTests.java @@ -33,7 +33,9 @@ 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/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryQueryMappingConfigurationIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryQueryMappingConfigurationIntegrationTests.java index 0bf20dca16..9a6a4798a0 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryQueryMappingConfigurationIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryQueryMappingConfigurationIntegrationTests.java @@ -15,7 +15,10 @@ */ package org.springframework.data.jdbc.repository; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; + +import lombok.AllArgsConstructor; +import lombok.Data; import java.sql.ResultSet; import java.sql.SQLException; @@ -43,9 +46,6 @@ import org.springframework.test.context.junit4.rules.SpringMethodRule; import org.springframework.transaction.annotation.Transactional; -import lombok.AllArgsConstructor; -import lombok.Data; - /** * Very simple use cases for creation and usage of {@link ResultSetExtractor}s in JdbcRepository. * @@ -66,7 +66,7 @@ static class Config { Class testClass() { return JdbcRepositoryQueryMappingConfigurationIntegrationTests.class; } - + @Bean QueryMappingConfiguration mappers() { return new DefaultQueryMappingConfiguration(); @@ -78,7 +78,7 @@ QueryMappingConfiguration mappers() { @Autowired NamedParameterJdbcTemplate template; @Autowired CarRepository carRepository; - + @Test // DATAJDBC-290 public void customFindAllCarsUsesConfiguredResultSetExtractor() { @@ -88,28 +88,27 @@ public void customFindAllCarsUsesConfiguredResultSetExtractor() { assertThat(cars).hasSize(1); assertThat(cars).allMatch(car -> CAR_MODEL.equals(car.getModel())); } - + interface CarRepository extends CrudRepository { @Query(value = "select * from car", resultSetExtractorClass = CarResultSetExtractor.class) List customFindAll(); } - + @Data @AllArgsConstructor static class Car { - @Id - private Long id; + @Id private Long id; private String model; } - + static class CarResultSetExtractor implements ResultSetExtractor> { @Override public List extractData(ResultSet rs) throws SQLException, DataAccessException { return Arrays.asList(new Car(1L, CAR_MODEL)); } - + } } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtensionUnitTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/JdbcRepositoryConfigExtensionUnitTests.java new file mode 100644 index 0000000000..7805fa2d01 --- /dev/null +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/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 {} +} diff --git a/spring-data-relational/pom.xml b/spring-data-relational/pom.xml index 1751c4244e..2da15cb40e 100644 --- a/spring-data-relational/pom.xml +++ b/spring-data-relational/pom.xml @@ -5,7 +5,7 @@ 4.0.0 spring-data-relational - 1.2.0.BUILD-SNAPSHOT + 1.2.0.DATAJDBC-437-SNAPSHOT Spring Data Relational Spring Data Relational support @@ -13,7 +13,7 @@ org.springframework.data spring-data-relational-parent - 1.2.0.BUILD-SNAPSHOT + 1.2.0.DATAJDBC-437-SNAPSHOT