From 0e592bbf256bcd784ff24f0fd272b45f74ae4d74 Mon Sep 17 00:00:00 2001 From: Romain Beghi Date: Thu, 13 Jun 2019 16:37:40 -0400 Subject: [PATCH] DATAREDIS-993 - Fix StreamOperations MapRecord HashValue serialization --- .../redis/connection/stream/MapRecord.java | 3 +- .../connection/StreamRecordsUnitTests.java | 32 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/stream/MapRecord.java b/src/main/java/org/springframework/data/redis/connection/stream/MapRecord.java index fddca01933..890f5a873f 100644 --- a/src/main/java/org/springframework/data/redis/connection/stream/MapRecord.java +++ b/src/main/java/org/springframework/data/redis/connection/stream/MapRecord.java @@ -34,6 +34,7 @@ * @param the value type of the backing map. * @author Christoph Strobl * @author Mark Paluch + * @author Romain Beghi * @since 2.2 */ public interface MapRecord extends Record>, Iterable> { @@ -125,7 +126,7 @@ default ByteRecord serialize(@Nullable RedisSerializer streamSerializ MapRecord binaryMap = mapEntries( it -> Collections.singletonMap(StreamSerialization.serialize(fieldSerializer, it.getKey()), - StreamSerialization.serialize(fieldSerializer, it.getValue())).entrySet().iterator().next()); + StreamSerialization.serialize(valueSerializer, it.getValue())).entrySet().iterator().next()); return StreamRecords.newRecord() // .in(streamSerializer != null ? streamSerializer.serialize(getStream()) : (byte[]) getStream()) // diff --git a/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java b/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java index d4dc12d664..dec5b0bf14 100644 --- a/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java @@ -28,10 +28,14 @@ import org.springframework.data.redis.connection.stream.RecordId; import org.springframework.data.redis.connection.stream.StreamRecords; import org.springframework.data.redis.hash.HashMapper; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; +import java.io.Serializable; + /** * @author Christoph Strobl + * @author Romain Beghi */ public class StreamRecordsUnitTests { @@ -39,10 +43,22 @@ public class StreamRecordsUnitTests { static final RecordId RECORD_ID = RecordId.of("1-0"); static final String STRING_MAP_KEY = "string-key"; static final String STRING_VAL = "string-val"; + static final DummyObject OBJECT_VAL = new DummyObject(); + + static final Jackson2JsonRedisSerializer JSON_REDIS_SERIALIZER = new Jackson2JsonRedisSerializer<>(DummyObject.class); static final byte[] SERIALIZED_STRING_VAL = RedisSerializer.string().serialize(STRING_VAL); static final byte[] SERIALIZED_STRING_MAP_KEY = RedisSerializer.string().serialize(STRING_MAP_KEY); static final byte[] SERIALIZED_STRING_STREAM_KEY = RedisSerializer.string().serialize(STRING_STREAM_KEY); + static final byte[] SERIALIZED_OBJECT_VAL = JSON_REDIS_SERIALIZER.serialize(OBJECT_VAL); + + private static class DummyObject implements Serializable { + private final Integer dummyId = 1; + + public Integer getDummyId() { + return this.dummyId; + } + } @Test // DATAREDIS-864 public void objectRecordToMapRecordViaHashMapper() { @@ -71,7 +87,7 @@ public void mapRecordToObjectRecordViaHashMapper() { } @Test // DATAREDIS-864 - public void serializeMapRecord() { + public void serializeMapRecordStringAsHashValue() { MapRecord source = Record.of(Collections.singletonMap(STRING_MAP_KEY, STRING_VAL)) .withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY); @@ -84,6 +100,20 @@ public void serializeMapRecord() { assertThat(target.getValue().values().iterator().next()).isEqualTo(SERIALIZED_STRING_VAL); } + @Test // DATAREDIS-993 + public void serializeMapRecordObjectAsHashValue() { + + MapRecord source = Record.of(Collections.singletonMap(STRING_MAP_KEY, OBJECT_VAL)) + .withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY); + + ByteRecord target = source.serialize(RedisSerializer.string(), RedisSerializer.string(), JSON_REDIS_SERIALIZER); + + assertThat(target.getId()).isEqualTo(RECORD_ID); + assertThat(target.getStream()).isEqualTo(SERIALIZED_STRING_STREAM_KEY); + assertThat(target.getValue().keySet().iterator().next()).isEqualTo(SERIALIZED_STRING_MAP_KEY); + assertThat(target.getValue().values().iterator().next()).isEqualTo(SERIALIZED_OBJECT_VAL); + } + @Test // DATAREDIS-864 public void deserializeByteMapRecord() {