Omit annotations from the repository and domaintype in CrudMethodMetadata. (#1170)

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.

Co-authored-by: mikereiche <michael.reiche@couchbase.com>
This commit is contained in:
Michael Reiche
2021-08-10 20:17:12 -07:00
committed by GitHub
parent 7cde6b919e
commit 9e3bfe5b71
3 changed files with 23 additions and 10 deletions

View File

@@ -145,7 +145,6 @@ class CrudMethodMetadataPostProcessor implements RepositoryProxyPostProcessor, B
currentInvocation.set(invocation);
try {
CrudMethodMetadata metadata = (CrudMethodMetadata) TransactionSynchronizationManager.getResource(method);
if (metadata != null) {
@@ -156,7 +155,7 @@ class CrudMethodMetadataPostProcessor implements RepositoryProxyPostProcessor, B
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 @@ class CrudMethodMetadataPostProcessor implements RepositoryProxyPostProcessor, B
private final Method method;
private final ScanConsistency scanConsistency;
private final RepositoryInformation repositoryInformation;
private final String scope;
private final String collection;
@@ -198,10 +196,9 @@ class CrudMethodMetadataPostProcessor implements RepositoryProxyPostProcessor, B
*
* @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 @@ class CrudMethodMetadataPostProcessor implements RepositoryProxyPostProcessor, B
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);

View File

@@ -38,7 +38,9 @@ import com.couchbase.client.java.query.QueryScanConsistency;
@ScanConsistency(query = QueryScanConsistency.REQUEST_PLUS)
public interface UserColRepository extends CouchbaseRepository<UserCol, String>, DynamicProxyable<UserColRepository> {
<S extends UserCol> S save(S var1);
// CouchbaseRepositoryQueryCollectionIntegrationTests.testScopeCollectionAnnotationSwap() relies on this
// being commented out.
//<S extends UserCol> S save(S var1);
List<UserCol> findByFirstname(String firstname);

View File

@@ -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 class CouchbaseRepositoryQueryCollectionIntegrationTests extends Collecti
// scope
List<UserCol> found = userColRepository.withCollection(otherCollection).findByFirstname(user.getFirstname());
assertEquals(saved, found.get(0), "should have found what was saved");
List<UserCol> notfound = userColRepository.withScope(CollectionIdentifier.DEFAULT_SCOPE)
List<UserCol> 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 class CouchbaseRepositoryQueryCollectionIntegrationTests extends Collecti
}
}
@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 class CouchbaseRepositoryQueryCollectionIntegrationTests extends Collecti
List<UserCol> found = userColRepository.withScope(scopeName).withCollection(collectionName)
.findByFirstname(user.getFirstname());
assertEquals(saved, found.get(0), "should have found what was saved");
List<UserCol> notfound = userColRepository.withScope(CollectionIdentifier.DEFAULT_SCOPE)
List<UserCol> 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);