diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 0dee9252a..c3fa4e82c 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -3112,8 +3112,7 @@ public class LettuceConnection implements RedisConnection { List result = eval(script.getBytes(), ReturnType.MULTI, 0); String nextCursorId = LettuceConverters.bytesToString().convert((byte[]) result.get(0)); - @SuppressWarnings("unchecked") - Map values = LettuceConverters.toMap((List) result.get(1)); + Map values = failsafeReadScanValues(result, LettuceConverters.bytesListToMapConverter()); return new ScanIteration>(Long.valueOf(nextCursorId), values.entrySet()); } }.open(); @@ -3139,7 +3138,6 @@ public class LettuceConnection implements RedisConnection { return new KeyBoundCursor(key, cursorId, options) { - @SuppressWarnings("unchecked") @Override protected ScanIteration doScan(byte[] key, long cursorId, ScanOptions options) { @@ -3154,7 +3152,8 @@ public class LettuceConnection implements RedisConnection { List result = eval(script.getBytes(), ReturnType.MULTI, 0); String nextCursorId = LettuceConverters.bytesToString().convert((byte[]) result.get(0)); - return new ScanIteration(Long.valueOf(nextCursorId), ((ArrayList) result.get(1))); + List values = failsafeReadScanValues(result, null); + return new ScanIteration(Long.valueOf(nextCursorId), values); } }.open(); } @@ -3179,7 +3178,6 @@ public class LettuceConnection implements RedisConnection { return new KeyBoundCursor(key, cursorId, options) { - @SuppressWarnings("unchecked") @Override protected ScanIteration doScan(byte[] key, long cursorId, ScanOptions options) { @@ -3194,12 +3192,23 @@ public class LettuceConnection implements RedisConnection { List result = eval(script.getBytes(), ReturnType.MULTI, 0); String nextCursorId = LettuceConverters.bytesToString().convert((byte[]) result.get(0)); - return new ScanIteration(Long.valueOf(nextCursorId), LettuceConverters.toTuple((List) result - .get(1))); + List values = failsafeReadScanValues(result, LettuceConverters.bytesListToTupleListConverter()); + return new ScanIteration(Long.valueOf(nextCursorId), values); } }.open(); } + @SuppressWarnings("unchecked") + private T failsafeReadScanValues(List source, @SuppressWarnings("rawtypes") Converter converter) { + + try { + return (T) (converter != null ? converter.convert(source.get(1)) : source.get(1)); + } catch (IndexOutOfBoundsException e) { + // ignore this one + } + return null; + } + /** * Specifies if pipelined and transaction results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Lettuce driver diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java index 6882d60e9..489a2fcc3 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java @@ -174,6 +174,10 @@ abstract public class LettuceConverters extends Converters { return BYTES_LIST_TO_TUPLE_LIST_CONVERTER.convert(list); } + public static Converter, List> bytesListToTupleListConverter() { + return BYTES_LIST_TO_TUPLE_LIST_CONVERTER; + } + public static Converter> stringToRedisClientListConverter() { return new Converter>() { @@ -290,6 +294,10 @@ abstract public class LettuceConverters extends Converters { return BYTES_LIST_TO_MAP.convert(source); } + public static Converter, Map> bytesListToMapConverter() { + return BYTES_LIST_TO_MAP; + } + public static SortArgs toSortArgs(SortParameters params) { SortArgs args = new SortArgs(); if (params == null) {