Skip to content

Commit eca5ac5

Browse files
committed
Polishing.
Enforce non-nullability of serializers when actually using these. See: #3223 Original pull request: #3244
1 parent b3b471d commit eca5ac5

File tree

6 files changed

+75
-19
lines changed

6 files changed

+75
-19
lines changed

src/main/java/org/springframework/data/redis/core/AbstractOperations.java

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
* @author Denis Zavedeev
5252
*/
5353
@NullUnmarked
54+
@SuppressWarnings("rawtypes")
5455
abstract class AbstractOperations<K, V> {
5556

5657
// utility methods for the template internal methods
@@ -93,22 +94,70 @@ ValueDeserializingRedisCallback valueCallbackFor(Object key, BiFunction<RedisCon
9394
return new FunctionalValueDeserializingRedisCallback(key, function);
9495
}
9596

97+
@Nullable
9698
RedisSerializer keySerializer() {
9799
return template.getKeySerializer();
98100
}
99101

102+
RedisSerializer requiredKeySerializer() {
103+
104+
RedisSerializer serializer = keySerializer();
105+
106+
if (serializer == null) {
107+
throw new IllegalStateException("No key serializer configured");
108+
}
109+
110+
return serializer;
111+
}
112+
113+
@Nullable
100114
RedisSerializer valueSerializer() {
101115
return template.getValueSerializer();
102116
}
103117

118+
RedisSerializer requiredValueSerializer() {
119+
120+
RedisSerializer serializer = valueSerializer();
121+
122+
if (serializer == null) {
123+
throw new IllegalStateException("No value serializer configured");
124+
}
125+
126+
return serializer;
127+
}
128+
129+
@Nullable
104130
RedisSerializer hashKeySerializer() {
105131
return template.getHashKeySerializer();
106132
}
107133

134+
RedisSerializer requiredHashKeySerializer() {
135+
136+
RedisSerializer serializer = hashKeySerializer();
137+
138+
if (serializer == null) {
139+
throw new IllegalStateException("No hash key serializer configured");
140+
}
141+
142+
return serializer;
143+
}
144+
145+
@Nullable
108146
RedisSerializer hashValueSerializer() {
109147
return template.getHashValueSerializer();
110148
}
111149

150+
RedisSerializer requiredHashValueSerializer() {
151+
152+
RedisSerializer serializer = hashValueSerializer();
153+
154+
if (serializer == null) {
155+
throw new IllegalStateException("No hash value serializer configured");
156+
}
157+
158+
return serializer;
159+
}
160+
112161
RedisSerializer stringSerializer() {
113162
return template.getStringSerializer();
114163
}
@@ -130,7 +179,7 @@ byte[] rawKey(@NonNull Object key) {
130179
return bytes;
131180
}
132181

133-
return keySerializer().serialize(key);
182+
return requiredKeySerializer().serialize(key);
134183
}
135184

136185
@SuppressWarnings("unchecked")
@@ -145,7 +194,7 @@ byte[] rawValue(Object value) {
145194
return bytes;
146195
}
147196

148-
return valueSerializer().serialize(value);
197+
return requiredValueSerializer().serialize(value);
149198
}
150199

151200
byte[][] rawValues(Object... values) {
@@ -309,23 +358,23 @@ <T> Set<T> deserializeHashKeys(Set<byte[]> rawKeys) {
309358
if (hashKeySerializer() == null) {
310359
return (Set<T>) rawKeys;
311360
}
312-
return SerializationUtils.deserialize(rawKeys, hashKeySerializer());
361+
return SerializationUtils.deserialize(rawKeys, requiredHashKeySerializer());
313362
}
314363

315364
@SuppressWarnings("unchecked")
316365
<T> List<T> deserializeHashKeys(List<byte[]> rawKeys) {
317366
if (hashKeySerializer() == null) {
318367
return (List<T>) rawKeys;
319368
}
320-
return SerializationUtils.deserialize(rawKeys, hashKeySerializer());
369+
return SerializationUtils.deserialize(rawKeys, requiredHashKeySerializer());
321370
}
322371

323372
@SuppressWarnings("unchecked")
324373
<T> List<T> deserializeHashValues(List<byte[]> rawValues) {
325374
if (hashValueSerializer() == null) {
326375
return (List<T>) rawValues;
327376
}
328-
return SerializationUtils.deserialize(rawValues, hashValueSerializer());
377+
return SerializationUtils.deserialize(rawValues, requiredHashValueSerializer());
329378
}
330379

331380
@SuppressWarnings("unchecked")
@@ -350,7 +399,7 @@ K deserializeKey(byte[] value) {
350399
if (keySerializer() == null) {
351400
return (K) value;
352401
}
353-
return (K) keySerializer().deserialize(value);
402+
return (K) requiredKeySerializer().deserialize(value);
354403
}
355404

356405
/**
@@ -375,7 +424,7 @@ V deserializeValue(byte[] value) {
375424
if (valueSerializer() == null) {
376425
return (V) value;
377426
}
378-
return (V) valueSerializer().deserialize(value);
427+
return (V) requiredValueSerializer().deserialize(value);
379428
}
380429

381430
String deserializeString(byte[] value) {
@@ -387,15 +436,15 @@ <HK> HK deserializeHashKey(byte[] value) {
387436
if (hashKeySerializer() == null) {
388437
return (HK) value;
389438
}
390-
return (HK) hashKeySerializer().deserialize(value);
439+
return (HK) requiredHashKeySerializer().deserialize(value);
391440
}
392441

393442
@SuppressWarnings("unchecked")
394443
<HV> HV deserializeHashValue(byte[] value) {
395444
if (hashValueSerializer() == null) {
396445
return (HV) value;
397446
}
398-
return (HV) hashValueSerializer().deserialize(value);
447+
return (HV) requiredHashValueSerializer().deserialize(value);
399448
}
400449

401450
/**

src/main/java/org/springframework/data/redis/core/DefaultStreamOperations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ public MapRecord<K, HK, HV> deserializeRecord(@NonNull ByteRecord record) {
340340
}
341341

342342
protected byte[] serializeHashValueIfRequires(HV value) {
343-
return hashValueSerializerPresent() ? serialize(value, hashValueSerializer())
343+
return hashValueSerializerPresent() ? serialize(value, requiredHashValueSerializer())
344344
: objectMapper.getConversionService().convert(value, byte[].class);
345345
}
346346

src/main/java/org/springframework/data/redis/core/RedisOperations.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -785,25 +785,25 @@ <T, S> List<T> sort(SortQuery<@NonNull K> query, @NonNull BulkMapper<T, S> bulkM
785785
/**
786786
* @return the key {@link RedisSerializer}.
787787
*/
788-
@NonNull
788+
@Nullable
789789
RedisSerializer<?> getKeySerializer();
790790

791791
/**
792792
* @return the value {@link RedisSerializer}.
793793
*/
794-
@NonNull
794+
@Nullable
795795
RedisSerializer<?> getValueSerializer();
796796

797797
/**
798798
* @return the hash key {@link RedisSerializer}.
799799
*/
800-
@NonNull
800+
@Nullable
801801
RedisSerializer<?> getHashKeySerializer();
802802

803803
/**
804804
* @return the hash value {@link RedisSerializer}.
805805
*/
806-
@NonNull
806+
@Nullable
807807
RedisSerializer<?> getHashValueSerializer();
808808

809809
}

src/main/java/org/springframework/data/redis/core/script/DefaultScriptExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ protected <T> T deserializeResult(RedisSerializer<T> resultSerializer, Object re
132132
}
133133

134134
@SuppressWarnings("rawtypes")
135-
protected RedisSerializer keySerializer() {
135+
protected @Nullable RedisSerializer keySerializer() {
136136
return template.getKeySerializer();
137137
}
138138

src/main/java/org/springframework/data/redis/serializer/SerializationUtils.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.jspecify.annotations.Nullable;
2828
import org.springframework.core.CollectionFactory;
2929
import org.springframework.lang.Contract;
30+
import org.springframework.util.Assert;
31+
import org.springframework.util.CollectionUtils;
3032

3133
/**
3234
* Utility class with various serialization-related methods.
@@ -46,10 +48,12 @@ static boolean isEmpty(byte @Nullable [] data) {
4648
static <T extends Collection<?>> T deserializeValues(@Nullable Collection<byte[]> rawValues, Class<T> type,
4749
@Nullable RedisSerializer<?> redisSerializer) {
4850
// connection in pipeline/multi mode
49-
if (rawValues == null) {
51+
if (CollectionUtils.isEmpty(rawValues)) {
5052
return (T) CollectionFactory.createCollection(type, 0);
5153
}
5254

55+
Assert.notNull(redisSerializer, "RedisSerializer must not be null");
56+
5357
Collection<Object> values = (List.class.isAssignableFrom(type) ? new ArrayList<>(rawValues.size())
5458
: new LinkedHashSet<>(rawValues.size()));
5559
for (byte[] bs : rawValues) {
@@ -79,9 +83,12 @@ public static <T> Collection<T> deserialize(@Nullable Collection<byte[]> rawValu
7983
public static <T> Map<T, @Nullable T> deserialize(@Nullable Map<byte[], byte[]> rawValues,
8084
RedisSerializer<T> redisSerializer) {
8185

82-
if (rawValues == null) {
86+
if (CollectionUtils.isEmpty(rawValues)) {
8387
return Collections.emptyMap();
8488
}
89+
90+
Assert.notNull(redisSerializer, "RedisSerializer must not be null");
91+
8592
Map<T, @Nullable T> ret = new LinkedHashMap<>(rawValues.size());
8693
for (Map.Entry<byte[], byte[]> entry : rawValues.entrySet()) {
8794
ret.put(redisSerializer.deserialize(entry.getKey()), redisSerializer.deserialize(entry.getValue()));
@@ -92,7 +99,7 @@ public static <T> Collection<T> deserialize(@Nullable Collection<byte[]> rawValu
9299
public static <HK, HV> Map<HK, HV> deserialize(@Nullable Map<byte[], byte[]> rawValues,
93100
@Nullable RedisSerializer<HK> hashKeySerializer, @Nullable RedisSerializer<HV> hashValueSerializer) {
94101

95-
if (rawValues == null) {
102+
if (CollectionUtils.isEmpty(rawValues)) {
96103
return Collections.emptyMap();
97104
}
98105

src/test/java/org/springframework/data/redis/core/DefaultValueOperationsIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ void testDecrementByLong() {
154154
assertThat(valueOps.get(key)).isEqualTo((Long) value - 5);
155155
}
156156

157-
@Test
157+
@Test // GH-3223
158158
void testMultiGet() {
159159

160160
K key1 = keyFactory.instance();

0 commit comments

Comments
 (0)