Skip to content

Commit 548d8e7

Browse files
Romain Beghimp911de
authored andcommitted
DATAREDIS-993 - Fix StreamOperations MapRecord HashValue serialization.
We now use the appropriate serializer to serialize hash values. Original pull request: #455.
1 parent 17e3488 commit 548d8e7

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/main/java/org/springframework/data/redis/connection/stream/MapRecord.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
* @param <V> the value type of the backing map.
3535
* @author Christoph Strobl
3636
* @author Mark Paluch
37+
* @author Romain Beghi
3738
* @since 2.2
3839
*/
3940
public interface MapRecord<S, K, V> extends Record<S, Map<K, V>>, Iterable<Map.Entry<K, V>> {
@@ -125,7 +126,7 @@ default ByteRecord serialize(@Nullable RedisSerializer<? super S> streamSerializ
125126

126127
MapRecord<S, byte[], byte[]> binaryMap = mapEntries(
127128
it -> Collections.singletonMap(StreamSerialization.serialize(fieldSerializer, it.getKey()),
128-
StreamSerialization.serialize(fieldSerializer, it.getValue())).entrySet().iterator().next());
129+
StreamSerialization.serialize(valueSerializer, it.getValue())).entrySet().iterator().next());
129130

130131
return StreamRecords.newRecord() //
131132
.in(streamSerializer != null ? streamSerializer.serialize(getStream()) : (byte[]) getStream()) //

src/test/java/org/springframework/data/redis/connection/StreamRecordsUnitTests.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,37 @@
2828
import org.springframework.data.redis.connection.stream.RecordId;
2929
import org.springframework.data.redis.connection.stream.StreamRecords;
3030
import org.springframework.data.redis.hash.HashMapper;
31+
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
3132
import org.springframework.data.redis.serializer.RedisSerializer;
3233

34+
import java.io.Serializable;
35+
3336
/**
3437
* @author Christoph Strobl
38+
* @author Romain Beghi
3539
*/
3640
public class StreamRecordsUnitTests {
3741

3842
static final String STRING_STREAM_KEY = "stream-key";
3943
static final RecordId RECORD_ID = RecordId.of("1-0");
4044
static final String STRING_MAP_KEY = "string-key";
4145
static final String STRING_VAL = "string-val";
46+
static final DummyObject OBJECT_VAL = new DummyObject();
47+
48+
static final Jackson2JsonRedisSerializer<DummyObject> JSON_REDIS_SERIALIZER = new Jackson2JsonRedisSerializer<>(DummyObject.class);
4249

4350
static final byte[] SERIALIZED_STRING_VAL = RedisSerializer.string().serialize(STRING_VAL);
4451
static final byte[] SERIALIZED_STRING_MAP_KEY = RedisSerializer.string().serialize(STRING_MAP_KEY);
4552
static final byte[] SERIALIZED_STRING_STREAM_KEY = RedisSerializer.string().serialize(STRING_STREAM_KEY);
53+
static final byte[] SERIALIZED_OBJECT_VAL = JSON_REDIS_SERIALIZER.serialize(OBJECT_VAL);
54+
55+
private static class DummyObject implements Serializable {
56+
private final Integer dummyId = 1;
57+
58+
public Integer getDummyId() {
59+
return this.dummyId;
60+
}
61+
}
4662

4763
@Test // DATAREDIS-864
4864
public void objectRecordToMapRecordViaHashMapper() {
@@ -71,7 +87,7 @@ public void mapRecordToObjectRecordViaHashMapper() {
7187
}
7288

7389
@Test // DATAREDIS-864
74-
public void serializeMapRecord() {
90+
public void serializeMapRecordStringAsHashValue() {
7591

7692
MapRecord<String, String, String> source = Record.of(Collections.singletonMap(STRING_MAP_KEY, STRING_VAL))
7793
.withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY);
@@ -84,6 +100,20 @@ public void serializeMapRecord() {
84100
assertThat(target.getValue().values().iterator().next()).isEqualTo(SERIALIZED_STRING_VAL);
85101
}
86102

103+
@Test // DATAREDIS-993
104+
public void serializeMapRecordObjectAsHashValue() {
105+
106+
MapRecord<String, String, DummyObject> source = Record.of(Collections.singletonMap(STRING_MAP_KEY, OBJECT_VAL))
107+
.withId(RECORD_ID).withStreamKey(STRING_STREAM_KEY);
108+
109+
ByteRecord target = source.serialize(RedisSerializer.string(), RedisSerializer.string(), JSON_REDIS_SERIALIZER);
110+
111+
assertThat(target.getId()).isEqualTo(RECORD_ID);
112+
assertThat(target.getStream()).isEqualTo(SERIALIZED_STRING_STREAM_KEY);
113+
assertThat(target.getValue().keySet().iterator().next()).isEqualTo(SERIALIZED_STRING_MAP_KEY);
114+
assertThat(target.getValue().values().iterator().next()).isEqualTo(SERIALIZED_OBJECT_VAL);
115+
}
116+
87117
@Test // DATAREDIS-864
88118
public void deserializeByteMapRecord() {
89119

0 commit comments

Comments
 (0)