From 4fcf6ad6320ce0f93692ae88c3969d18b39779be Mon Sep 17 00:00:00 2001 From: mikereiche Date: Tue, 10 Aug 2021 20:04:43 -0700 Subject: [PATCH] Omit annotations from the repository and domaintype in CrudMethodMetadata. Omit annotations from the repository and domaintype in CrudMethodMetadata as they may be different for the same method. The annotations from the repository and domaintype are obtained directly in CouchbaseRepositoryBase. Closes #1168. --- .../CrudMethodMetadataPostProcessor.java | 10 +++------- .../couchbase/domain/UserColRepository.java | 4 +++- ...sitoryQueryCollectionIntegrationTests.java | 19 +++++++++++++++++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/couchbase/repository/support/CrudMethodMetadataPostProcessor.java b/src/main/java/org/springframework/data/couchbase/repository/support/CrudMethodMetadataPostProcessor.java index 836db257f..0e5dd19bf 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/support/CrudMethodMetadataPostProcessor.java +++ b/src/main/java/org/springframework/data/couchbase/repository/support/CrudMethodMetadataPostProcessor.java @@ -145,7 +145,6 @@ public Object invoke(MethodInvocation invocation) throws Throwable { currentInvocation.set(invocation); try { - CrudMethodMetadata metadata = (CrudMethodMetadata) TransactionSynchronizationManager.getResource(method); if (metadata != null) { @@ -156,7 +155,7 @@ public Object invoke(MethodInvocation invocation) throws Throwable { if (methodMetadata == null) { - methodMetadata = new DefaultCrudMethodMetadata(method, repositoryInformation); + methodMetadata = new DefaultCrudMethodMetadata(method); CrudMethodMetadata tmp = metadataCache.putIfAbsent(method, methodMetadata); if (tmp != null) { @@ -187,7 +186,6 @@ private static class DefaultCrudMethodMetadata implements CrudMethodMetadata { private final Method method; private final ScanConsistency scanConsistency; - private final RepositoryInformation repositoryInformation; private final String scope; private final String collection; @@ -198,10 +196,9 @@ private static class DefaultCrudMethodMetadata implements CrudMethodMetadata { * * @param method must not be {@literal null}. */ - DefaultCrudMethodMetadata(Method method, RepositoryInformation repositoryInformation) { + DefaultCrudMethodMetadata(Method method) { Assert.notNull(method, "Method must not be null!"); this.method = method; - this.repositoryInformation = repositoryInformation; String n = method.getName(); // internal methods if (n.equals("getEntityInformation") || n.equals("getOperations") || n.equals("withOptions") @@ -212,8 +209,7 @@ private static class DefaultCrudMethodMetadata implements CrudMethodMetadata { return; } - AnnotatedElement[] annotated = new AnnotatedElement[] { method, method.getDeclaringClass(), - repositoryInformation.getRepositoryInterface(), repositoryInformation.getDomainType() }; + AnnotatedElement[] annotated = new AnnotatedElement[] { method, method.getDeclaringClass()}; this.scanConsistency = OptionsBuilder.annotation(ScanConsistency.class, "query", QueryScanConsistency.NOT_BOUNDED, annotated); this.scope = OptionsBuilder.annotationString(Scope.class, CollectionIdentifier.DEFAULT_SCOPE, annotated); diff --git a/src/test/java/org/springframework/data/couchbase/domain/UserColRepository.java b/src/test/java/org/springframework/data/couchbase/domain/UserColRepository.java index e1bbaa370..412a5755d 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/UserColRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/UserColRepository.java @@ -38,7 +38,9 @@ @ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS) public interface UserColRepository extends CouchbaseRepository, DynamicProxyable { - S save(S var1); + // CouchbaseRepositoryQueryCollectionIntegrationTests.testScopeCollectionAnnotationSwap() relies on this + // being commented out. + // S save(S var1); List findByFirstname(String firstname); diff --git a/src/test/java/org/springframework/data/couchbase/repository/query/CouchbaseRepositoryQueryCollectionIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/query/CouchbaseRepositoryQueryCollectionIntegrationTests.java index f522671e8..82d24e8d5 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/query/CouchbaseRepositoryQueryCollectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/query/CouchbaseRepositoryQueryCollectionIntegrationTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.couchbase.repository.query; +import static com.couchbase.client.core.io.CollectionIdentifier.DEFAULT_SCOPE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -178,7 +179,7 @@ public void testScopeCollectionAnnotation() { // scope List found = userColRepository.withCollection(otherCollection).findByFirstname(user.getFirstname()); assertEquals(saved, found.get(0), "should have found what was saved"); - List notfound = userColRepository.withScope(CollectionIdentifier.DEFAULT_SCOPE) + List notfound = userColRepository.withScope(DEFAULT_SCOPE) .withCollection(CollectionIdentifier.DEFAULT_COLLECTION).findByFirstname(user.getFirstname()); assertEquals(0, notfound.size(), "should not have found what was saved"); } finally { @@ -188,6 +189,20 @@ public void testScopeCollectionAnnotation() { } } + @Test + public void testScopeCollectionAnnotationSwap() { + // UserCol annotation scope is other_scope, collection is other_collection + // airportRepository relies on Config.setScopeName(scopeName) ("my_scope") from CollectionAwareIntegrationTests. + // using airportRepository without specified a collection should fail. + // This test ensures that airportRepository.save(airport) doesn't get the + // collection from CrudMethodMetadata of UserCol.save() + UserCol userCol = new UserCol("1", "Dave", "Wilson"); + Airport airport = new Airport("3", "myIata", "myIcao"); + UserCol savedCol = userColRepository.save(userCol); // uses UserCol annotation scope, populates CrudMethodMetadata + userColRepository.delete(userCol); // uses UserCol annotation scope, populates CrudMethodMetadata + assertThrows(IllegalStateException.class, () -> airportRepository.save(airport)); + } + // template default scope is my_scope // UserCol annotation scope is other_scope @Test @@ -198,7 +213,7 @@ public void testScopeCollectionRepoWith() { List found = userColRepository.withScope(scopeName).withCollection(collectionName) .findByFirstname(user.getFirstname()); assertEquals(saved, found.get(0), "should have found what was saved"); - List notfound = userColRepository.withScope(CollectionIdentifier.DEFAULT_SCOPE) + List notfound = userColRepository.withScope(DEFAULT_SCOPE) .withCollection(CollectionIdentifier.DEFAULT_COLLECTION).findByFirstname(user.getFirstname()); assertEquals(0, notfound.size(), "should not have found what was saved"); userColRepository.withScope(scopeName).withCollection(collectionName).delete(user);