From 5f62882a3edc5690fe62dd3fc7dc801ceaa9dd60 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 27 Nov 2014 14:29:50 +0100 Subject: [PATCH] DATAKV-89 - KeyValueTemplate now throws DuplicateKeyException. We now throw DuplicateKeyException instead of InvalidDataAccessApiUsageException in case an object with given id already exists. Original pull request: spring-projects/spring-data-commons#106. --- .../data/keyvalue/core/KeyValueTemplate.java | 4 +++- .../data/keyvalue/core/KeyValueTemplateTests.java | 4 ++-- .../data/keyvalue/core/KeyValueTemplateUnitTests.java | 10 +++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java b/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java index 331c270..820d18a 100644 --- a/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java +++ b/src/main/java/org/springframework/data/keyvalue/core/KeyValueTemplate.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.concurrent.ConcurrentHashMap; import org.springframework.dao.DataAccessException; +import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.dao.support.PersistenceExceptionTranslator; import org.springframework.data.domain.Sort; @@ -117,7 +118,8 @@ public class KeyValueTemplate implements KeyValueOperations { String typeKey = resolveKeySpace(objectToInsert.getClass()); if (adapter.contains(id, typeKey)) { - throw new InvalidDataAccessApiUsageException("Cannot insert existing object. Please use update."); + throw new DuplicateKeyException(String.format( + "Cannot insert existing object with id %s!. Please use update.", id)); } adapter.put(id, objectToInsert, typeKey); diff --git a/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateTests.java b/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateTests.java index 1bc4efb..d359f71 100644 --- a/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateTests.java +++ b/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateTests.java @@ -33,7 +33,7 @@ import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.springframework.dao.InvalidDataAccessApiUsageException; +import org.springframework.dao.DuplicateKeyException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Persistent; import org.springframework.data.keyvalue.annotation.KeySpace; @@ -94,7 +94,7 @@ public class KeyValueTemplateTests { /** * @see DATACMNS-525 */ - @Test(expected = InvalidDataAccessApiUsageException.class) + @Test(expected = DuplicateKeyException.class) public void insertShouldThrowExecptionWhenObjectOfSameTypeAlreadyExists() { operations.insert("1", FOO_ONE); diff --git a/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java b/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java index eb2deab..d207147 100644 --- a/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java +++ b/src/test/java/org/springframework/data/keyvalue/core/KeyValueTemplateUnitTests.java @@ -30,11 +30,14 @@ import java.util.Arrays; import java.util.Collection; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Persistent; @@ -49,6 +52,8 @@ import org.springframework.util.ObjectUtils; @RunWith(MockitoJUnitRunner.class) public class KeyValueTemplateUnitTests { + public @Rule ExpectedException exception = ExpectedException.none(); + private static final Foo FOO_ONE = new Foo("one"); private static final Foo FOO_TWO = new Foo("two"); private static final ClassWithTypeAlias ALIASED = new ClassWithTypeAlias("super"); @@ -105,9 +110,12 @@ public class KeyValueTemplateUnitTests { /** * @see DATACMNS-525 */ - @Test(expected = InvalidDataAccessApiUsageException.class) + @Test public void insertShouldThrowExceptionWhenObectWithIdAlreadyExists() { + exception.expect(DuplicateKeyException.class); + exception.expectMessage("id 1"); + when(adapterMock.contains(anyString(), anyString())).thenReturn(true); template.insert("1", FOO_ONE);