Skip to content

Commit 70cb773

Browse files
christophstroblmp911de
authored andcommitted
DATAREDIS-925 - Add and register binary read/write converter for UUID.
Original pull request: spring-projects#444.
1 parent 321199c commit 70cb773

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

src/main/java/org/springframework/data/redis/core/convert/BinaryConverters.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.text.ParseException;
2222
import java.util.Arrays;
2323
import java.util.Date;
24+
import java.util.UUID;
2425

2526
import org.springframework.core.convert.converter.Converter;
2627
import org.springframework.core.convert.converter.ConverterFactory;
@@ -270,4 +271,35 @@ public Date convert(byte[] source) {
270271
throw new IllegalArgumentException(String.format("Cannot parse date out of %s", Arrays.toString(source)));
271272
}
272273
}
274+
275+
/**
276+
* @author Christoph Strobl
277+
* @since 2.2
278+
*/
279+
@WritingConverter
280+
static class UuidToBytesConverter extends StringBasedConverter implements Converter<UUID, byte[]> {
281+
282+
@Override
283+
public byte[] convert(UUID source) {
284+
return fromString(source.toString());
285+
}
286+
}
287+
288+
/**
289+
* @author Christoph Strobl
290+
* @since 2.2
291+
*/
292+
@ReadingConverter
293+
static class BytesToUuidConverter extends StringBasedConverter implements Converter<byte[], UUID> {
294+
295+
@Override
296+
public UUID convert(byte[] source) {
297+
298+
if (ObjectUtils.isEmpty(source)) {
299+
return null;
300+
}
301+
302+
return UUID.fromString(toString(source));
303+
}
304+
}
273305
}

src/main/java/org/springframework/data/redis/core/convert/RedisCustomConversions.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class RedisCustomConversions extends org.springframework.data.convert.Cus
4949
converters.add(new BinaryConverters.BytesToBooleanConverter());
5050
converters.add(new BinaryConverters.DateToBytesConverter());
5151
converters.add(new BinaryConverters.BytesToDateConverter());
52+
converters.add(new BinaryConverters.UuidToBytesConverter());
53+
converters.add(new BinaryConverters.BytesToUuidConverter());
5254
converters.addAll(Jsr310Converters.getConvertersToRegister());
5355

5456
STORE_CONVERTERS = Collections.unmodifiableList(converters);

src/test/java/org/springframework/data/redis/core/convert/ConversionTestEntities.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.List;
3434
import java.util.Map;
3535
import java.util.Set;
36+
import java.util.UUID;
3637
import java.util.concurrent.TimeUnit;
3738

3839
import org.springframework.data.annotation.Id;
@@ -222,4 +223,10 @@ static class Device {
222223
final Instant now;
223224
final Set<String> profiles;
224225
}
226+
227+
@Data
228+
public static class JustSomeDifferentPropertyTypes {
229+
230+
UUID uuid;
231+
}
225232
}

src/test/java/org/springframework/data/redis/core/convert/MappingRedisConverterUnitTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,25 @@ public void shouldReadPrimitveTypes() {
18441844
assertThat(read(Size.class, source).height, is(equalTo(1000)));
18451845
}
18461846

1847+
@Test // DATAREDIS-925
1848+
public void readUUID() {
1849+
1850+
UUID uuid = UUID.randomUUID();
1851+
Map<String, String> source = new LinkedHashMap<>();
1852+
source.put("uuid", uuid.toString());
1853+
1854+
assertThat(read(JustSomeDifferentPropertyTypes.class, source).uuid, is(equalTo(uuid)));
1855+
}
1856+
1857+
@Test // DATAREDIS-925
1858+
public void writeUUID() {
1859+
1860+
JustSomeDifferentPropertyTypes source = new JustSomeDifferentPropertyTypes();
1861+
source.uuid = UUID.randomUUID();
1862+
1863+
assertThat(write(source).getBucket(), isBucket().containingUtf8String("uuid", source.uuid.toString()));
1864+
}
1865+
18471866
private RedisData write(Object source) {
18481867

18491868
RedisData rdo = new RedisData();

0 commit comments

Comments
 (0)