From e21db26bd95aaecba9a455f3e0fdac1501951600 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 12 Mar 2018 10:47:26 +0100 Subject: [PATCH] DATACMNS-1278 - Make sure that SimpleTypeHolder always treats enums as simple. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now explicitly check for an enum type in SimpleTypeHolder.isSimpleType(…) and resort to true immediately. Before that an enum implementing an interface could have seen a false for the actual enum type in case the interface type had been checked first and (correctly) produced a false. In the check for the actual enum type, depending on the iteration order through the cached values we could've hit the cached false for the interface or the cached true value for Enum. --- .../data/mapping/model/SimpleTypeHolder.java | 2 +- .../data/mapping/SimpleTypeHolderUnitTests.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/mapping/model/SimpleTypeHolder.java b/src/main/java/org/springframework/data/mapping/model/SimpleTypeHolder.java index 648522951..e1f62f182 100644 --- a/src/main/java/org/springframework/data/mapping/model/SimpleTypeHolder.java +++ b/src/main/java/org/springframework/data/mapping/model/SimpleTypeHolder.java @@ -147,7 +147,7 @@ public class SimpleTypeHolder { Map, Boolean> localSimpleTypes = this.simpleTypes; Boolean isSimpleType = localSimpleTypes.get(type); - if (Object.class.equals(type)) { + if (Object.class.equals(type) || Enum.class.isAssignableFrom(type)) { return true; } diff --git a/src/test/java/org/springframework/data/mapping/SimpleTypeHolderUnitTests.java b/src/test/java/org/springframework/data/mapping/SimpleTypeHolderUnitTests.java index 34caed74e..ca221907d 100755 --- a/src/test/java/org/springframework/data/mapping/SimpleTypeHolderUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/SimpleTypeHolderUnitTests.java @@ -131,6 +131,15 @@ public class SimpleTypeHolderUnitTests { assertThat(holder.isSimpleType(ExtendedPerson.class)).isFalse(); } + @Test // DATACMNS-1278 + public void alwaysConsidersEnumsSimple() { + + SimpleTypeHolder holder = SimpleTypeHolder.DEFAULT; + + assertThat(holder.isSimpleType(SomeInterface.class)).isFalse(); + assertThat(holder.isSimpleType(InterfacedEnum.class)).isTrue(); + } + enum SimpleEnum { FOO; @@ -155,4 +164,8 @@ public class SimpleTypeHolderUnitTests { static class ExtendedPerson extends Person { } + + interface SomeInterface {} + + enum InterfacedEnum implements SomeInterface {} }