DATAREDIS-925 - Add and register binary read/write converter for UUID.

Original pull request: #444.
This commit is contained in:
Christoph Strobl
2019-03-26 14:40:27 +01:00
committed by Mark Paluch
parent 321199c084
commit 70cb773afe
4 changed files with 60 additions and 0 deletions

View File

@@ -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<UUID, byte[]> {
@Override
public byte[] convert(UUID source) {
return fromString(source.toString());
}
}
/**
* @author Christoph Strobl
* @since 2.2
*/
@ReadingConverter
static class BytesToUuidConverter extends StringBasedConverter implements Converter<byte[], UUID> {
@Override
public UUID convert(byte[] source) {
if (ObjectUtils.isEmpty(source)) {
return null;
}
return UUID.fromString(toString(source));
}
}
}

View File

@@ -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);

View File

@@ -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<String> profiles;
}
@Data
public static class JustSomeDifferentPropertyTypes {
UUID uuid;
}
}

View File

@@ -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<String, String> 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();