diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java index 8f80eaf09..fdef739bf 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java @@ -70,10 +70,12 @@ import org.springframework.util.ClassUtils; public class RedisTemplate extends RedisAccessor implements RedisOperations { private boolean exposeConnection = false; - private RedisSerializer keySerializer = new JdkSerializationRedisSerializer(); - private RedisSerializer valueSerializer = new JdkSerializationRedisSerializer(); - private RedisSerializer hashKeySerializer = new JdkSerializationRedisSerializer(); - private RedisSerializer hashValueSerializer = new JdkSerializationRedisSerializer(); + private RedisSerializer defaultSerializer = new JdkSerializationRedisSerializer(); + + private RedisSerializer keySerializer = null; + private RedisSerializer valueSerializer = null; + private RedisSerializer hashKeySerializer = null; + private RedisSerializer hashValueSerializer = null; private RedisSerializer stringSerializer = new StringRedisSerializer(); // cache singleton objects (where possible) @@ -99,6 +101,36 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation afterPropertiesSet(); } + + @Override + public void afterPropertiesSet() { + super.afterPropertiesSet(); + boolean defaultUsed = false; + + if (keySerializer == null) { + keySerializer = defaultSerializer; + defaultUsed = true; + } + if (valueSerializer == null) { + valueSerializer = defaultSerializer; + defaultUsed = true; + } + + if (hashKeySerializer == null) { + hashKeySerializer = defaultSerializer; + defaultUsed = true; + } + + if (hashValueSerializer == null) { + hashValueSerializer = defaultSerializer; + defaultUsed = true; + } + + if (defaultUsed) { + Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized"); + } + } + @Override public T execute(RedisCallback action) { return execute(action, isExposeConnection()); @@ -236,7 +268,26 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation } /** - * Sets the key serializer to be used by this template. Defaults to {@link JdkSerializationRedisSerializer}. + * Returns the default serializer used by this template. + * + * @return template default serializer + */ + public RedisSerializer getDefaultSerializer() { + return defaultSerializer; + } + + /** + * Sets the default serializer to use for this template. All serializers (expect the {@link #setStringSerializer(RedisSerializer)}) are + * initialized to this value unless explicitly set. Defaults to {@link JdkSerializationRedisSerializer}. + * + * @param serializer default serializer to use + */ + public void setDefaultSerializer(RedisSerializer serializer) { + this.defaultSerializer = serializer; + } + + /** + * Sets the key serializer to be used by this template. Defaults to {@link getDefaultSerializer}. * * @param serializer */ @@ -254,7 +305,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation } /** - * Sets the value serializer to be used by this template. Defaults to {@link JdkSerializationRedisSerializer}. + * Sets the value serializer to be used by this template. Defaults to {@link getDefaultSerializer}. * * @param serializer */ @@ -272,7 +323,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation } /** - * Sets the hash key (or field) serializer to be used by this template. Defaults to {@link JdkSerializationRedisSerializer}. + * Sets the hash key (or field) serializer to be used by this template. Defaults to {@link getDefaultSerializer}. * * @param hashKeySerializer The hashKeySerializer to set. */ @@ -281,7 +332,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation } /** - * Sets the hash value serializer to be used by this template. Defaults to {@link JdkSerializationRedisSerializer}. + * Sets the hash value serializer to be used by this template. Defaults to {@link getDefaultSerializer}. * * @param hashValueSerializer The hashValueSerializer to set. */ diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/serializer/OxmSerializer.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/serializer/OxmSerializer.java index 74ddec929..596e22f87 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/serializer/OxmSerializer.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/serializer/OxmSerializer.java @@ -91,6 +91,7 @@ public class OxmSerializer implements InitializingBean, RedisSerializer ByteArrayOutputStream stream = new ByteArrayOutputStream(); StreamResult result = new StreamResult(stream); + try { marshaller.marshal(t, result); } catch (Exception ex) { diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java index 0d1c07145..5ff257fae 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/CollectionTestParams.java @@ -23,6 +23,8 @@ import org.springframework.data.keyvalue.redis.SettingsUtils; import org.springframework.data.keyvalue.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.keyvalue.redis.connection.jredis.JredisConnectionFactory; import org.springframework.data.keyvalue.redis.core.RedisTemplate; +import org.springframework.data.keyvalue.redis.serializer.OxmSerializer; +import org.springframework.oxm.xstream.XStreamMarshaller; /** * @author Costin Leau @@ -30,6 +32,15 @@ import org.springframework.data.keyvalue.redis.core.RedisTemplate; public abstract class CollectionTestParams { public static Collection testParams() { + // XStream serializer + XStreamMarshaller xstream = new XStreamMarshaller(); + try { + xstream.afterPropertiesSet(); + } catch (Exception ex) { + throw new RuntimeException("Cannot init XStream", ex); + } + OxmSerializer serializer = new OxmSerializer(xstream, xstream); + // create Jedis Factory ObjectFactory stringFactory = new StringObjectFactory(); ObjectFactory personFactory = new PersonObjectFactory(); @@ -45,6 +56,14 @@ public abstract class CollectionTestParams { RedisTemplate stringTemplate = new RedisTemplate(jedisConnFactory); RedisTemplate personTemplate = new RedisTemplate(jedisConnFactory); + RedisTemplate xstreamStringTemplate = new RedisTemplate(); + xstreamStringTemplate.setConnectionFactory(jedisConnFactory); + xstreamStringTemplate.setDefaultSerializer(serializer); + xstreamStringTemplate.afterPropertiesSet(); + + RedisTemplate xstreamPersonTemplate = new RedisTemplate(jedisConnFactory); + xstreamPersonTemplate.setValueSerializer(serializer); + JredisConnectionFactory jredisConnFactory = new JredisConnectionFactory(); jredisConnFactory.setUsePool(true); @@ -56,8 +75,17 @@ public abstract class CollectionTestParams { RedisTemplate stringTemplateJR = new RedisTemplate(jredisConnFactory); RedisTemplate personTemplateJR = new RedisTemplate(jredisConnFactory); + RedisTemplate xstreamStringTemplateJR = new RedisTemplate(); + xstreamStringTemplateJR.setConnectionFactory(jredisConnFactory); + xstreamStringTemplateJR.setDefaultSerializer(serializer); + xstreamStringTemplateJR.afterPropertiesSet(); + + RedisTemplate xstreamPersonTemplateJR = new RedisTemplate(jredisConnFactory); + xstreamPersonTemplateJR.setValueSerializer(serializer); + return Arrays.asList(new Object[][] { { stringFactory, stringTemplateJR }, { personFactory, personTemplateJR }, - { stringFactory, stringTemplate }, - { personFactory, personTemplate } }); + { stringFactory, stringTemplate }, { personFactory, personTemplate }, + { stringFactory, xstreamStringTemplate }, { personFactory, xstreamPersonTemplate }, + { stringFactory, xstreamStringTemplateJR }, { personFactory, xstreamPersonTemplateJR } }); } } diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/RedisMapTests.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/RedisMapTests.java index 0fbf94f22..dc6b9d2ff 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/RedisMapTests.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/support/collections/RedisMapTests.java @@ -24,6 +24,8 @@ import org.springframework.data.keyvalue.redis.SettingsUtils; import org.springframework.data.keyvalue.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.keyvalue.redis.connection.jredis.JredisConnectionFactory; import org.springframework.data.keyvalue.redis.core.RedisTemplate; +import org.springframework.data.keyvalue.redis.serializer.OxmSerializer; +import org.springframework.oxm.xstream.XStreamMarshaller; /** * Integration test for RedisMap. @@ -44,6 +46,16 @@ public class RedisMapTests extends AbstractRedisMapTests { @Parameters public static Collection testParams() { + // XStream serializer + XStreamMarshaller xstream = new XStreamMarshaller(); + try { + xstream.afterPropertiesSet(); + } catch (Exception ex) { + throw new RuntimeException("Cannot init XStream", ex); + } + OxmSerializer serializer = new OxmSerializer(xstream, xstream); + + // create Jedis Factory ObjectFactory stringFactory = new StringObjectFactory(); ObjectFactory personFactory = new PersonObjectFactory(); @@ -58,6 +70,11 @@ public class RedisMapTests extends AbstractRedisMapTests { RedisTemplate genericTemplate = new RedisTemplate(jedisConnFactory); + RedisTemplate xstreamGenericTemplate = new RedisTemplate(); + xstreamGenericTemplate.setConnectionFactory(jedisConnFactory); + xstreamGenericTemplate.setDefaultSerializer(serializer); + xstreamGenericTemplate.afterPropertiesSet(); + JredisConnectionFactory jredisConnFactory = new JredisConnectionFactory(); jredisConnFactory.setUsePool(true); @@ -70,11 +87,23 @@ public class RedisMapTests extends AbstractRedisMapTests { RedisTemplate genericTemplateJR = new RedisTemplate(jredisConnFactory); + RedisTemplate xGenericTemplateJR = new RedisTemplate(); + xGenericTemplateJR.setConnectionFactory(jredisConnFactory); + xGenericTemplateJR.setDefaultSerializer(serializer); + xGenericTemplateJR.afterPropertiesSet(); + + RedisTemplate xstreamPersonTemplateJR = new RedisTemplate(jredisConnFactory); + xstreamPersonTemplateJR.setValueSerializer(serializer); + + return Arrays.asList(new Object[][] { { stringFactory, stringFactory, genericTemplate }, { personFactory, personFactory, genericTemplate }, { stringFactory, personFactory, genericTemplate }, - { personFactory, stringFactory, genericTemplate }, { stringFactory, stringFactory, genericTemplateJR }, + { personFactory, stringFactory, genericTemplate }, + { personFactory, stringFactory, xstreamGenericTemplate }, + { stringFactory, stringFactory, genericTemplateJR }, { personFactory, personFactory, genericTemplateJR }, { stringFactory, personFactory, genericTemplateJR }, - { personFactory, stringFactory, genericTemplateJR } }); + { personFactory, stringFactory, genericTemplateJR }, + { personFactory, stringFactory, xGenericTemplateJR } }); } } \ No newline at end of file