Skip to content

Commit 86dec7e

Browse files
committed
Convert CasMismatch to OptimisticLocking.
Closes #1311.
1 parent f08b24e commit 86dec7e

File tree

5 files changed

+16
-7
lines changed

5 files changed

+16
-7
lines changed

src/main/java/org/springframework/data/couchbase/core/CouchbaseExceptionTranslator.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.dao.DataRetrievalFailureException;
2626
import org.springframework.dao.DuplicateKeyException;
2727
import org.springframework.dao.InvalidDataAccessResourceUsageException;
28+
import org.springframework.dao.OptimisticLockingFailureException;
2829
import org.springframework.dao.QueryTimeoutException;
2930
import org.springframework.dao.TransientDataAccessResourceException;
3031
import org.springframework.dao.support.PersistenceExceptionTranslator;
@@ -66,7 +67,11 @@ public final DataAccessException translateExceptionIfPossible(final RuntimeExcep
6667
return new DataRetrievalFailureException(ex.getMessage(), ex);
6768
}
6869

69-
if (ex instanceof CasMismatchException || ex instanceof ConcurrentModificationException
70+
if (ex instanceof CasMismatchException) {
71+
return new OptimisticLockingFailureException(ex.getMessage(), ex);
72+
}
73+
74+
if (ex instanceof ConcurrentModificationException
7075
|| ex instanceof ReplicaNotConfiguredException || ex instanceof DurabilityLevelNotAvailableException
7176
|| ex instanceof DurabilityImpossibleException || ex instanceof DurabilityAmbiguousException) {
7277
return new DataIntegrityViolationException(ex.getMessage(), ex);

src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeyValueIntegrationTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.junit.jupiter.api.Test;
4141
import org.springframework.dao.DataIntegrityViolationException;
4242
import org.springframework.dao.DuplicateKeyException;
43+
import org.springframework.dao.OptimisticLockingFailureException;
4344
import org.springframework.data.couchbase.core.ExecutableFindByIdOperation.ExecutableFindById;
4445
import org.springframework.data.couchbase.core.ExecutableRemoveByIdOperation.ExecutableRemoveById;
4546
import org.springframework.data.couchbase.core.ExecutableReplaceByIdOperation.ExecutableReplaceById;
@@ -138,7 +139,7 @@ void upsertAndFindById() {
138139

139140
User badUser = new User(user.getId(), user.getFirstname(), user.getLastname());
140141
badUser.setVersion(12345678);
141-
assertThrows(DataIntegrityViolationException.class, () -> couchbaseTemplate.replaceById(User.class).one(badUser));
142+
assertThrows(OptimisticLockingFailureException.class, () -> couchbaseTemplate.replaceById(User.class).one(badUser));
142143

143144
User found = couchbaseTemplate.findById(User.class).one(user.getId());
144145
assertEquals(modified, found);
@@ -346,7 +347,7 @@ void upsertAndRemoveById() {
346347
// careful now - user and modified are the same object. The object has the new cas (@Version version)
347348
Long savedCas = modified.getVersion();
348349
modified.setVersion(123);
349-
assertThrows(DataIntegrityViolationException.class, () -> couchbaseTemplate.removeById()
350+
assertThrows(OptimisticLockingFailureException.class, () -> couchbaseTemplate.removeById()
350351
.withCas(reactiveCouchbaseTemplate.support().getCas(modified)).one(modified.getId()));
351352
modified.setVersion(savedCas);
352353
couchbaseTemplate.removeById().withCas(reactiveCouchbaseTemplate.support().getCas(modified))

src/test/java/org/springframework/data/couchbase/core/ReactiveCouchbaseTemplateKeyValueIntegrationTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.junit.jupiter.api.Test;
4040
import org.springframework.dao.DataIntegrityViolationException;
4141
import org.springframework.dao.DuplicateKeyException;
42+
import org.springframework.dao.OptimisticLockingFailureException;
4243
import org.springframework.data.couchbase.core.ReactiveFindByIdOperation.ReactiveFindById;
4344
import org.springframework.data.couchbase.core.ReactiveRemoveByIdOperation.ReactiveRemoveById;
4445
import org.springframework.data.couchbase.core.ReactiveReplaceByIdOperation.ReactiveReplaceById;
@@ -130,7 +131,7 @@ void upsertAndFindById() {
130131

131132
User badUser = new User(user.getId(), user.getFirstname(), user.getLastname());
132133
badUser.setVersion(12345678);
133-
assertThrows(DataIntegrityViolationException.class,
134+
assertThrows(OptimisticLockingFailureException.class,
134135
() -> reactiveCouchbaseTemplate.replaceById(User.class).one(badUser).block());
135136

136137
User found = reactiveCouchbaseTemplate.findById(User.class).one(user.getId()).block();
@@ -282,7 +283,7 @@ void upsertAndRemoveById() {
282283
// careful now - user and modified are the same object. The object has the new cas (@Version version)
283284
Long savedCas = modified.getVersion();
284285
modified.setVersion(123);
285-
assertThrows(DataIntegrityViolationException.class, () -> reactiveCouchbaseTemplate.removeById()
286+
assertThrows(OptimisticLockingFailureException.class, () -> reactiveCouchbaseTemplate.removeById()
286287
.withCas(reactiveCouchbaseTemplate.support().getCas(modified)).one(modified.getId()).block());
287288
modified.setVersion(savedCas);
288289
reactiveCouchbaseTemplate.removeById().withCas(reactiveCouchbaseTemplate.support().getCas(modified))

src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.springframework.context.annotation.Configuration;
5757
import org.springframework.dao.DataIntegrityViolationException;
5858
import org.springframework.dao.DataRetrievalFailureException;
59+
import org.springframework.dao.OptimisticLockingFailureException;
5960
import org.springframework.data.auditing.DateTimeProvider;
6061
import org.springframework.data.couchbase.CouchbaseClientFactory;
6162
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
@@ -556,7 +557,7 @@ public void testCas() {
556557
User user = new User("1", "Dave", "Wilson");
557558
userRepository.save(user);
558559
user.setVersion(user.getVersion() - 1);
559-
assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user));
560+
assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user));
560561
user.setVersion(0);
561562
userRepository.save(user);
562563
userRepository.delete(user);

src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.junit.jupiter.api.Assertions.assertThrows;
2323
import static org.junit.jupiter.api.Assertions.assertTrue;
2424

25+
import org.springframework.dao.OptimisticLockingFailureException;
2526
import reactor.core.publisher.Flux;
2627
import reactor.core.publisher.Mono;
2728
import reactor.test.StepVerifier;
@@ -119,7 +120,7 @@ public void testCas() {
119120
User user = new User("1", "Dave", "Wilson");
120121
userRepository.save(user).block();
121122
user.setVersion(user.getVersion() - 1);
122-
assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user).block());
123+
assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user).block());
123124
user.setVersion(0);
124125
userRepository.save(user).block();
125126
userRepository.delete(user).block();

0 commit comments

Comments
 (0)