From 5909a491dcef2139baeeed13ec5898ef1de037f4 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 28 Aug 2024 12:27:20 +0200 Subject: [PATCH] Fix error deserializing enum values with flattening Jackson2HashMapper. This commit makes sure the mapper does not attempt to read type alias when deserializing enums. Original pull request: #2980 Closes #2979 --- .../data/redis/hash/Jackson2HashMapper.java | 2 +- .../mapping/Jackson2HashMapperUnitTests.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/redis/hash/Jackson2HashMapper.java b/src/main/java/org/springframework/data/redis/hash/Jackson2HashMapper.java index e7dcb37b1..7b5ca2054 100644 --- a/src/main/java/org/springframework/data/redis/hash/Jackson2HashMapper.java +++ b/src/main/java/org/springframework/data/redis/hash/Jackson2HashMapper.java @@ -177,7 +177,7 @@ public class Jackson2HashMapper implements HashMapper { return false; } - if (flatten && type.isTypeOrSubTypeOf(Number.class)) { + if (flatten && (type.isTypeOrSubTypeOf(Number.class) || type.isEnumType())) { return false; } diff --git a/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java b/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java index 4ca104122..9b0735e6b 100644 --- a/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java +++ b/src/test/java/org/springframework/data/redis/mapping/Jackson2HashMapperUnitTests.java @@ -203,6 +203,15 @@ public abstract class Jackson2HashMapperUnitTests extends AbstractHashMapperTest assertBackAndForwardMapping(source); } + @Test // GH-2979 + void enumsShouldBeTreatedCorrectly() { + + WithEnumValue source = new WithEnumValue(); + source.value = SpringDataEnum.REDIS; + + assertBackAndForwardMapping(source); + } + public static class WithList { List strings; @@ -452,4 +461,38 @@ public abstract class Jackson2HashMapperUnitTests extends AbstractHashMapperTest return Objects.hash(getValue()); } } + + enum SpringDataEnum { + COMMONS, REDIS + } + + static class WithEnumValue { + + SpringDataEnum value; + + public SpringDataEnum getValue() { + return value; + } + + public void setValue(SpringDataEnum value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + WithEnumValue that = (WithEnumValue) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + } }