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);