From 70cb773afe2b2ad02a9d551923bdc9cb05ab3440 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 26 Mar 2019 14:40:27 +0100 Subject: [PATCH] DATAREDIS-925 - Add and register binary read/write converter for UUID. Original pull request: #444. --- .../redis/core/convert/BinaryConverters.java | 32 +++++++++++++++++++ .../core/convert/RedisCustomConversions.java | 2 ++ .../core/convert/ConversionTestEntities.java | 7 ++++ .../MappingRedisConverterUnitTests.java | 19 +++++++++++ 4 files changed, 60 insertions(+) diff --git a/src/main/java/org/springframework/data/redis/core/convert/BinaryConverters.java b/src/main/java/org/springframework/data/redis/core/convert/BinaryConverters.java index adee2673c..a0b2d5a40 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/BinaryConverters.java +++ b/src/main/java/org/springframework/data/redis/core/convert/BinaryConverters.java @@ -21,6 +21,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.util.Arrays; import java.util.Date; +import java.util.UUID; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterFactory; @@ -270,4 +271,35 @@ final class BinaryConverters { throw new IllegalArgumentException(String.format("Cannot parse date out of %s", Arrays.toString(source))); } } + + /** + * @author Christoph Strobl + * @since 2.2 + */ + @WritingConverter + static class UuidToBytesConverter extends StringBasedConverter implements Converter { + + @Override + public byte[] convert(UUID source) { + return fromString(source.toString()); + } + } + + /** + * @author Christoph Strobl + * @since 2.2 + */ + @ReadingConverter + static class BytesToUuidConverter extends StringBasedConverter implements Converter { + + @Override + public UUID convert(byte[] source) { + + if (ObjectUtils.isEmpty(source)) { + return null; + } + + return UUID.fromString(toString(source)); + } + } } diff --git a/src/main/java/org/springframework/data/redis/core/convert/RedisCustomConversions.java b/src/main/java/org/springframework/data/redis/core/convert/RedisCustomConversions.java index 0722e0bbc..ff2810fba 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/RedisCustomConversions.java +++ b/src/main/java/org/springframework/data/redis/core/convert/RedisCustomConversions.java @@ -49,6 +49,8 @@ public class RedisCustomConversions extends org.springframework.data.convert.Cus converters.add(new BinaryConverters.BytesToBooleanConverter()); converters.add(new BinaryConverters.DateToBytesConverter()); converters.add(new BinaryConverters.BytesToDateConverter()); + converters.add(new BinaryConverters.UuidToBytesConverter()); + converters.add(new BinaryConverters.BytesToUuidConverter()); converters.addAll(Jsr310Converters.getConvertersToRegister()); STORE_CONVERTERS = Collections.unmodifiableList(converters); diff --git a/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java b/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java index dd3c3f358..82361e72c 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java +++ b/src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.TimeUnit; import org.springframework.data.annotation.Id; @@ -222,4 +223,10 @@ public class ConversionTestEntities { final Instant now; final Set profiles; } + + @Data + public static class JustSomeDifferentPropertyTypes { + + UUID uuid; + } } diff --git a/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java b/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java index d240fe176..9135f7805 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java @@ -1844,6 +1844,25 @@ public class MappingRedisConverterUnitTests { assertThat(read(Size.class, source).height, is(equalTo(1000))); } + @Test // DATAREDIS-925 + public void readUUID() { + + UUID uuid = UUID.randomUUID(); + Map source = new LinkedHashMap<>(); + source.put("uuid", uuid.toString()); + + assertThat(read(JustSomeDifferentPropertyTypes.class, source).uuid, is(equalTo(uuid))); + } + + @Test // DATAREDIS-925 + public void writeUUID() { + + JustSomeDifferentPropertyTypes source = new JustSomeDifferentPropertyTypes(); + source.uuid = UUID.randomUUID(); + + assertThat(write(source).getBucket(), isBucket().containingUtf8String("uuid", source.uuid.toString())); + } + private RedisData write(Object source) { RedisData rdo = new RedisData();