diff --git a/src/main/java/org/springframework/data/couchbase/core/CouchbaseExceptionTranslator.java b/src/main/java/org/springframework/data/couchbase/core/CouchbaseExceptionTranslator.java index 264c8334e..b08c2818f 100644 --- a/src/main/java/org/springframework/data/couchbase/core/CouchbaseExceptionTranslator.java +++ b/src/main/java/org/springframework/data/couchbase/core/CouchbaseExceptionTranslator.java @@ -25,6 +25,7 @@ import org.springframework.dao.DataRetrievalFailureException; import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.InvalidDataAccessResourceUsageException; +import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.dao.QueryTimeoutException; import org.springframework.dao.TransientDataAccessResourceException; import org.springframework.dao.support.PersistenceExceptionTranslator; @@ -66,7 +67,11 @@ public final DataAccessException translateExceptionIfPossible(final RuntimeExcep return new DataRetrievalFailureException(ex.getMessage(), ex); } - if (ex instanceof CasMismatchException || ex instanceof ConcurrentModificationException + if (ex instanceof CasMismatchException) { + return new OptimisticLockingFailureException(ex.getMessage(), ex); + } + + if (ex instanceof ConcurrentModificationException || ex instanceof ReplicaNotConfiguredException || ex instanceof DurabilityLevelNotAvailableException || ex instanceof DurabilityImpossibleException || ex instanceof DurabilityAmbiguousException) { return new DataIntegrityViolationException(ex.getMessage(), ex); diff --git a/src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeyValueIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeyValueIntegrationTests.java index 66bf472a6..8253795f6 100644 --- a/src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeyValueIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeyValueIntegrationTests.java @@ -40,6 +40,7 @@ import org.junit.jupiter.api.Test; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; +import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.couchbase.core.ExecutableFindByIdOperation.ExecutableFindById; import org.springframework.data.couchbase.core.ExecutableRemoveByIdOperation.ExecutableRemoveById; import org.springframework.data.couchbase.core.ExecutableReplaceByIdOperation.ExecutableReplaceById; @@ -138,7 +139,7 @@ void upsertAndFindById() { User badUser = new User(user.getId(), user.getFirstname(), user.getLastname()); badUser.setVersion(12345678); - assertThrows(DataIntegrityViolationException.class, () -> couchbaseTemplate.replaceById(User.class).one(badUser)); + assertThrows(OptimisticLockingFailureException.class, () -> couchbaseTemplate.replaceById(User.class).one(badUser)); User found = couchbaseTemplate.findById(User.class).one(user.getId()); assertEquals(modified, found); @@ -346,7 +347,7 @@ void upsertAndRemoveById() { // careful now - user and modified are the same object. The object has the new cas (@Version version) Long savedCas = modified.getVersion(); modified.setVersion(123); - assertThrows(DataIntegrityViolationException.class, () -> couchbaseTemplate.removeById() + assertThrows(OptimisticLockingFailureException.class, () -> couchbaseTemplate.removeById() .withCas(reactiveCouchbaseTemplate.support().getCas(modified)).one(modified.getId())); modified.setVersion(savedCas); couchbaseTemplate.removeById().withCas(reactiveCouchbaseTemplate.support().getCas(modified)) diff --git a/src/test/java/org/springframework/data/couchbase/core/ReactiveCouchbaseTemplateKeyValueIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/core/ReactiveCouchbaseTemplateKeyValueIntegrationTests.java index 379e76fc3..2d8481596 100644 --- a/src/test/java/org/springframework/data/couchbase/core/ReactiveCouchbaseTemplateKeyValueIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/core/ReactiveCouchbaseTemplateKeyValueIntegrationTests.java @@ -39,6 +39,7 @@ import org.junit.jupiter.api.Test; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; +import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.couchbase.core.ReactiveFindByIdOperation.ReactiveFindById; import org.springframework.data.couchbase.core.ReactiveRemoveByIdOperation.ReactiveRemoveById; import org.springframework.data.couchbase.core.ReactiveReplaceByIdOperation.ReactiveReplaceById; @@ -130,7 +131,7 @@ void upsertAndFindById() { User badUser = new User(user.getId(), user.getFirstname(), user.getLastname()); badUser.setVersion(12345678); - assertThrows(DataIntegrityViolationException.class, + assertThrows(OptimisticLockingFailureException.class, () -> reactiveCouchbaseTemplate.replaceById(User.class).one(badUser).block()); User found = reactiveCouchbaseTemplate.findById(User.class).one(user.getId()).block(); @@ -282,7 +283,7 @@ void upsertAndRemoveById() { // careful now - user and modified are the same object. The object has the new cas (@Version version) Long savedCas = modified.getVersion(); modified.setVersion(123); - assertThrows(DataIntegrityViolationException.class, () -> reactiveCouchbaseTemplate.removeById() + assertThrows(OptimisticLockingFailureException.class, () -> reactiveCouchbaseTemplate.removeById() .withCas(reactiveCouchbaseTemplate.support().getCas(modified)).one(modified.getId()).block()); modified.setVersion(savedCas); reactiveCouchbaseTemplate.removeById().withCas(reactiveCouchbaseTemplate.support().getCas(modified)) diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java index 343157d75..de41edd13 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -56,6 +56,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataRetrievalFailureException; +import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.auditing.DateTimeProvider; import org.springframework.data.couchbase.CouchbaseClientFactory; import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration; @@ -556,7 +557,7 @@ public void testCas() { User user = new User("1", "Dave", "Wilson"); userRepository.save(user); user.setVersion(user.getVersion() - 1); - assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user)); + assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user)); user.setVersion(0); userRepository.save(user); userRepository.delete(user); diff --git a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java index a5f015d50..5d56f1491 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import org.springframework.dao.OptimisticLockingFailureException; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -119,7 +120,7 @@ public void testCas() { User user = new User("1", "Dave", "Wilson"); userRepository.save(user).block(); user.setVersion(user.getVersion() - 1); - assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user).block()); + assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user).block()); user.setVersion(0); userRepository.save(user).block(); userRepository.delete(user).block();