From 1702a4a653d51ddbea96ac24836eceeb71045bb5 Mon Sep 17 00:00:00 2001 From: argszero Date: Thu, 21 Apr 2016 13:34:17 +0800 Subject: [PATCH 1/3] DATAREDIS-500 - executePipelined with RedisCallback uses wrong serializer (RedisTemplate.java) `RedisTemplate.java`: `executePipelined` with `RedisCallback` uses wrong `serializer` when `hashKeySerializer` is different from `hashValueSerializer` --- .../data/redis/core/RedisTemplate.java | 2 +- .../data/redis/core/RedisTemplateTests.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/redis/core/RedisTemplate.java b/src/main/java/org/springframework/data/redis/core/RedisTemplate.java index 7a9dcb9ade..d283b391fc 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisTemplate.java +++ b/src/main/java/org/springframework/data/redis/core/RedisTemplate.java @@ -273,7 +273,7 @@ public List doInRedis(RedisConnection connection) throws DataAccessExcep } List closePipeline = connection.closePipeline(); pipelinedClosed = true; - return deserializeMixedResults(closePipeline, resultSerializer, resultSerializer, resultSerializer); + return deserializeMixedResults(closePipeline, resultSerializer, hashKeySerializer, hashValueSerializer); } finally { if (!pipelinedClosed) { connection.closePipeline(); diff --git a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java index 5df2daa3d2..ebc596ddd1 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java @@ -314,6 +314,22 @@ public Object doInRedis(RedisConnection connection) throws DataAccessException { assertEquals(Arrays.asList(new Object[] { 5l, 1l, 2l, Arrays.asList(new Long[] { 10l, 11l }) }), results); } + @Test + public void testExecutePipelinedWidthDifferentHashKeySerializerAndHashValueSerializer() { + assumeTrue(redisTemplate instanceof RedisTemplate); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class)); + redisTemplate.opsForHash().put((K) "foo", "key", 1L); + List results = redisTemplate.executePipelined(new RedisCallback() { + public Object doInRedis(RedisConnection connection) throws DataAccessException { + connection.hGetAll(((StringRedisSerializer) redisTemplate.getKeySerializer()).serialize("foo")); + return null; + } + }); + assertEquals(((Map) results.get(0)).get("key"), 1L); + } + @Test(expected = InvalidDataAccessApiUsageException.class) public void testExecutePipelinedNonNullRedisCallback() { redisTemplate.executePipelined(new RedisCallback() { From 5af00b43fa4c224ea898eff131964e5f229c4044 Mon Sep 17 00:00:00 2001 From: argszero Date: Fri, 22 Apr 2016 19:04:55 +0800 Subject: [PATCH 2/3] DATAREDIS-500 - executePipelined with RedisCallback uses wrong serializer (RedisTemplate.java) `RedisTemplate.java`: `executePipelined` with `RedisCallback` uses wrong `serializer` when `hashKeySerializer` is different from `hashValueSerializer` --- .../springframework/data/redis/core/RedisTemplateTests.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java index ebc596ddd1..017186615a 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java @@ -51,6 +51,7 @@ import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.StringRedisConnection; +import org.springframework.data.redis.connection.jedis.JedisClusterConnection; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jredis.JredisConnectionFactory; import org.springframework.data.redis.connection.srp.SrpConnectionFactory; @@ -316,7 +317,7 @@ public Object doInRedis(RedisConnection connection) throws DataAccessException { @Test public void testExecutePipelinedWidthDifferentHashKeySerializerAndHashValueSerializer() { - assumeTrue(redisTemplate instanceof RedisTemplate); + assumeFalse(redisTemplate.getConnectionFactory() instanceof JedisClusterConnection); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class)); From 8c0b1a1266eb4a8def3ea52b0749bd377394693d Mon Sep 17 00:00:00 2001 From: argszero Date: Fri, 22 Apr 2016 19:23:44 +0800 Subject: [PATCH 3/3] DATAREDIS-500 - executePipelined with RedisCallback uses wrong serializer (RedisTemplate.java) `RedisTemplate.java`: `executePipelined` with `RedisCallback` uses wrong `serializer` when `hashKeySerializer` is different from `hashValueSerializer` --- .../org/springframework/data/redis/core/RedisTemplateTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java index 017186615a..dad2619010 100644 --- a/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java +++ b/src/test/java/org/springframework/data/redis/core/RedisTemplateTests.java @@ -317,7 +317,7 @@ public Object doInRedis(RedisConnection connection) throws DataAccessException { @Test public void testExecutePipelinedWidthDifferentHashKeySerializerAndHashValueSerializer() { - assumeFalse(redisTemplate.getConnectionFactory() instanceof JedisClusterConnection); + assumeTrue(redisTemplate instanceof StringRedisTemplate); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericToStringSerializer(Long.class));