From 4d41beff31f16987d395e8a7997454b213670ec6 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 19 Oct 2017 14:09:29 +0200 Subject: [PATCH] DATAREDIS-713 - Polishing. Added static methods for common serializers (string, json, java) to RedisSerializer. Original Pull Request: #288 --- .../data/redis/cache/RedisCache.java | 4 +- .../redis/cache/RedisCacheConfiguration.java | 7 ++-- .../DefaultStringRedisConnection.java | 2 +- .../data/redis/core/RedisTemplate.java | 2 +- .../data/redis/core/StringRedisTemplate.java | 8 ++-- .../RedisMessageListenerContainer.java | 4 +- .../adapter/MessageListenerAdapter.java | 4 +- .../DefaultRedisSerializationContext.java | 2 +- .../serializer/RedisSerializationContext.java | 2 +- .../redis/serializer/RedisSerializer.java | 37 ++++++++++++++++++- .../serializer/StringRedisSerializer.java | 20 ++++++---- .../support/atomic/RedisAtomicDouble.java | 2 +- .../support/atomic/RedisAtomicInteger.java | 2 +- .../redis/support/atomic/RedisAtomicLong.java | 2 +- .../data/redis/cache/RedisCacheTests.java | 2 +- .../AbstractConnectionIntegrationTests.java | 4 +- 16 files changed, 70 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCache.java b/src/main/java/org/springframework/data/redis/cache/RedisCache.java index fa7adf255..acac187de 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCache.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCache.java @@ -24,7 +24,7 @@ import org.springframework.cache.support.NullValue; import org.springframework.cache.support.SimpleValueWrapper; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; -import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.util.ByteUtils; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -44,7 +44,7 @@ import org.springframework.util.ReflectionUtils; */ public class RedisCache extends AbstractValueAdaptingCache { - private static final byte[] BINARY_NULL_VALUE = new JdkSerializationRedisSerializer().serialize(NullValue.INSTANCE); + private static final byte[] BINARY_NULL_VALUE = RedisSerializer.java().serialize(NullValue.INSTANCE); private final String name; private final RedisCacheWriter cacheWriter; diff --git a/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java b/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java index 39514da6f..4ec8081fc 100644 --- a/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java +++ b/src/main/java/org/springframework/data/redis/cache/RedisCacheConfiguration.java @@ -23,9 +23,8 @@ import org.springframework.cache.Cache; import org.springframework.cache.interceptor.SimpleKey; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.converter.ConverterRegistry; -import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext.SerializationPair; -import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.lang.Nullable; import org.springframework.util.Assert; @@ -95,8 +94,8 @@ public class RedisCacheConfiguration { registerDefaultConverters(conversionService); return new RedisCacheConfiguration(Duration.ZERO, true, true, null, - SerializationPair.fromSerializer(StringRedisSerializer.UTF_8), - SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()), conversionService); + SerializationPair.fromSerializer(RedisSerializer.string()), + SerializationPair.fromSerializer(RedisSerializer.java()), conversionService); } /** diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java index 66bfc612d..2648faf9d 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -117,7 +117,7 @@ public class DefaultStringRedisConnection implements StringRedisConnection, Deco * @param connection Redis connection */ public DefaultStringRedisConnection(RedisConnection connection) { - this(connection, StringRedisSerializer.UTF_8); + this(connection, RedisSerializer.string()); } /** 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 cf1ba0a01..e315fa962 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisTemplate.java +++ b/src/main/java/org/springframework/data/redis/core/RedisTemplate.java @@ -96,7 +96,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation @SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null; - private RedisSerializer stringSerializer = StringRedisSerializer.UTF_8; + private RedisSerializer stringSerializer = RedisSerializer.string(); private @Nullable ScriptExecutor scriptExecutor; diff --git a/src/main/java/org/springframework/data/redis/core/StringRedisTemplate.java b/src/main/java/org/springframework/data/redis/core/StringRedisTemplate.java index b7df3131c..6a6fb1acf 100644 --- a/src/main/java/org/springframework/data/redis/core/StringRedisTemplate.java +++ b/src/main/java/org/springframework/data/redis/core/StringRedisTemplate.java @@ -40,10 +40,10 @@ public class StringRedisTemplate extends RedisTemplate { * and {@link #afterPropertiesSet()} still need to be called. */ public StringRedisTemplate() { - setKeySerializer(StringRedisSerializer.UTF_8); - setValueSerializer(StringRedisSerializer.UTF_8); - setHashKeySerializer(StringRedisSerializer.UTF_8); - setHashValueSerializer(StringRedisSerializer.UTF_8); + setKeySerializer(RedisSerializer.string()); + setValueSerializer(RedisSerializer.string()); + setHashKeySerializer(RedisSerializer.string()); + setHashValueSerializer(RedisSerializer.string()); } /** diff --git a/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java b/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java index edd6c4d0f..6e59244fe 100644 --- a/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java +++ b/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java @@ -127,7 +127,7 @@ public class RedisMessageListenerContainer implements InitializingBean, Disposab private final SubscriptionTask subscriptionTask = new SubscriptionTask(); - private volatile RedisSerializer serializer = StringRedisSerializer.UTF_8; + private volatile RedisSerializer serializer = RedisSerializer.string(); private long recoveryInterval = DEFAULT_RECOVERY_INTERVAL; @@ -307,7 +307,7 @@ public class RedisMessageListenerContainer implements InitializingBean, Disposab * @param connectionFactory The connectionFactory to set. */ public void setConnectionFactory(RedisConnectionFactory connectionFactory) { - + Assert.notNull(connectionFactory, "ConnectionFactory must not be null!"); this.connectionFactory = connectionFactory; } diff --git a/src/main/java/org/springframework/data/redis/listener/adapter/MessageListenerAdapter.java b/src/main/java/org/springframework/data/redis/listener/adapter/MessageListenerAdapter.java index 80a6d54ac..1bc18f5c6 100644 --- a/src/main/java/org/springframework/data/redis/listener/adapter/MessageListenerAdapter.java +++ b/src/main/java/org/springframework/data/redis/listener/adapter/MessageListenerAdapter.java @@ -318,8 +318,8 @@ public class MessageListenerAdapter implements InitializingBean, MessageListener * @see JdkSerializationRedisSerializer */ protected void initDefaultStrategies() { - setSerializer(StringRedisSerializer.UTF_8); - setStringSerializer(StringRedisSerializer.UTF_8); + setSerializer(RedisSerializer.string()); + setStringSerializer(RedisSerializer.string()); } /** diff --git a/src/main/java/org/springframework/data/redis/serializer/DefaultRedisSerializationContext.java b/src/main/java/org/springframework/data/redis/serializer/DefaultRedisSerializationContext.java index 26e1e7ea5..f23f84253 100644 --- a/src/main/java/org/springframework/data/redis/serializer/DefaultRedisSerializationContext.java +++ b/src/main/java/org/springframework/data/redis/serializer/DefaultRedisSerializationContext.java @@ -98,7 +98,7 @@ class DefaultRedisSerializationContext implements RedisSerializationContex private @Nullable SerializationPair valueTuple; private @Nullable SerializationPair hashKeyTuple; private @Nullable SerializationPair hashValueTuple; - private SerializationPair stringTuple = SerializationPair.fromSerializer(StringRedisSerializer.UTF_8); + private SerializationPair stringTuple = SerializationPair.fromSerializer(RedisSerializer.string()); /* (non-Javadoc) * @see org.springframework.data.redis.serializer.RedisSerializationContextBuilder#key(SerializationPair) diff --git a/src/main/java/org/springframework/data/redis/serializer/RedisSerializationContext.java b/src/main/java/org/springframework/data/redis/serializer/RedisSerializationContext.java index 19f1c1ec7..66ab73adf 100644 --- a/src/main/java/org/springframework/data/redis/serializer/RedisSerializationContext.java +++ b/src/main/java/org/springframework/data/redis/serializer/RedisSerializationContext.java @@ -93,7 +93,7 @@ public interface RedisSerializationContext { * @return */ static RedisSerializationContext string() { - return fromSerializer(StringRedisSerializer.UTF_8); + return fromSerializer(RedisSerializer.string()); } /** diff --git a/src/main/java/org/springframework/data/redis/serializer/RedisSerializer.java b/src/main/java/org/springframework/data/redis/serializer/RedisSerializer.java index f1c4b0496..66cb038e5 100644 --- a/src/main/java/org/springframework/data/redis/serializer/RedisSerializer.java +++ b/src/main/java/org/springframework/data/redis/serializer/RedisSerializer.java @@ -1,5 +1,5 @@ /* - * Copyright 2011-2013 the original author or authors. + * Copyright 2011-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import org.springframework.lang.Nullable; * Basic interface serialization and deserialization of Objects to byte arrays (binary data). It is recommended that * implementations are designed to handle null objects/empty arrays on serialization and deserialization side. Note that * Redis does not accept null keys or values but can return null replies (for non existing keys). - * + * * @author Mark Pollack * @author Costin Leau * @author Christoph Strobl @@ -45,4 +45,37 @@ public interface RedisSerializer { */ @Nullable T deserialize(@Nullable byte[] bytes) throws SerializationException; + + /** + * Obtain a {@link RedisSerializer} using java serialization.
+ * Note: Ensure that your domain objects are actually {@link java.io.Serializable serializable}. + * + * @return never {@literal null}. + * @since 2.1 + */ + static RedisSerializer java() { + return new JdkSerializationRedisSerializer(); + } + + /** + * Obtain a {@link RedisSerializer} that can read and write JSON using + * Jackson. + * + * @return never {@literal null}. + * @since 2.1 + */ + static RedisSerializer json() { + return new GenericJackson2JsonRedisSerializer(); + } + + /** + * Obtain a simple {@link java.lang.String} to {@literal byte[]} (and back) serializer using + * {@link java.nio.charset.StandardCharsets#UTF_8 UTF-8} as the default {@link java.nio.charset.Charset}. + * + * @return never {@literal null}. + * @since 2.1 + */ + static RedisSerializer string() { + return StringRedisSerializer.UTF_8; + } } diff --git a/src/main/java/org/springframework/data/redis/serializer/StringRedisSerializer.java b/src/main/java/org/springframework/data/redis/serializer/StringRedisSerializer.java index 2a8abd6b1..fe858f08a 100644 --- a/src/main/java/org/springframework/data/redis/serializer/StringRedisSerializer.java +++ b/src/main/java/org/springframework/data/redis/serializer/StringRedisSerializer.java @@ -22,8 +22,8 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** - * Simple {@literal} to {@literal byte[]} (and back) serializer. Converts Strings into bytes and vice-versa using the - * specified charset (by default UTF-8). + * Simple {@link java.lang.String} to {@literal byte[]} (and back) serializer. Converts {@link java.lang.String Strings} + * into bytes and vice-versa using the specified charset (by default {@literal UTF-8}). *

* Useful when the interaction with the Redis happens mainly through Strings. *

@@ -38,22 +38,26 @@ public class StringRedisSerializer implements RedisSerializer { private final Charset charset; /** - * Serializer to use 7 bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set. - * + * {@link StringRedisSerializer} to use 7 bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode + * character set. + * + * @see StandardCharsets#US_ASCII * @since 2.1 */ public static final StringRedisSerializer US_ASCII = new StringRedisSerializer(StandardCharsets.US_ASCII); /** - * Serializer to use ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1. - * + * {@link StringRedisSerializer} to use ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1. + * + * @see StandardCharsets#ISO_8859_1 * @since 2.1 */ public static final StringRedisSerializer ISO_8859_1 = new StringRedisSerializer(StandardCharsets.ISO_8859_1); /** - * Serializer to use 8 bit UCS Transformation Format. - * + * {@link StringRedisSerializer} to use 8 bit UCS Transformation Format. + * + * @see StandardCharsets#UTF_8 * @since 2.1 */ public static final StringRedisSerializer UTF_8 = new StringRedisSerializer(StandardCharsets.UTF_8); diff --git a/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicDouble.java b/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicDouble.java index 2ec4c69f4..2db8b5f46 100644 --- a/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicDouble.java +++ b/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicDouble.java @@ -79,7 +79,7 @@ public class RedisAtomicDouble extends Number implements Serializable, BoundKeyO Assert.notNull(factory, "a valid factory is required"); RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8); + redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(new GenericToStringSerializer<>(Double.class)); redisTemplate.setExposeConnection(true); redisTemplate.setConnectionFactory(factory); diff --git a/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicInteger.java b/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicInteger.java index 3ba3c7d73..d0d9e709e 100644 --- a/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicInteger.java +++ b/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicInteger.java @@ -102,7 +102,7 @@ public class RedisAtomicInteger extends Number implements Serializable, BoundKey private RedisAtomicInteger(String redisCounter, RedisConnectionFactory factory, @Nullable Integer initialValue) { RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8); + redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(new GenericToStringSerializer<>(Integer.class)); redisTemplate.setExposeConnection(true); redisTemplate.setConnectionFactory(factory); diff --git a/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicLong.java b/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicLong.java index 766cb29e5..6edb81bed 100644 --- a/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicLong.java +++ b/src/main/java/org/springframework/data/redis/support/atomic/RedisAtomicLong.java @@ -79,7 +79,7 @@ public class RedisAtomicLong extends Number implements Serializable, BoundKeyOpe Assert.notNull(factory, "a valid factory is required"); RedisTemplate redisTemplate = new RedisTemplate<>(); - redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8); + redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(new GenericToStringSerializer<>(Long.class)); redisTemplate.setExposeConnection(true); redisTemplate.setConnectionFactory(factory); diff --git a/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java b/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java index 67d98cf9e..6f16a3bad 100644 --- a/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java +++ b/src/test/java/org/springframework/data/redis/cache/RedisCacheTests.java @@ -61,7 +61,7 @@ public class RedisCacheTests { Person sample = new Person("calmity", new Date()); byte[] binarySample; - byte[] binaryNullValue = new JdkSerializationRedisSerializer().serialize(NullValue.INSTANCE); + byte[] binaryNullValue = RedisSerializer.java().serialize(NullValue.INSTANCE); RedisConnectionFactory connectionFactory; RedisSerializer serializer; diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index b48c59048..03250bff6 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -99,8 +99,8 @@ public abstract class AbstractConnectionIntegrationTests { private static final GeoLocation PALERMO = new GeoLocation<>("palermo", POINT_PALERMO); protected StringRedisConnection connection; - protected RedisSerializer serializer = new JdkSerializationRedisSerializer(); - protected RedisSerializer stringSerializer = StringRedisSerializer.UTF_8; + protected RedisSerializer serializer = RedisSerializer.java(); + protected RedisSerializer stringSerializer = RedisSerializer.string(); private static final byte[] EMPTY_ARRAY = new byte[0];