From 0f174f68675baff804886f3f23f236cf495599e1 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 00a2db896..3cc4d8f71 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 ebb0b43d0..6820828f0 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 {} }