From 09d470710416287945aa4da0794422937050b4f5 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 9 Aug 2011 11:58:59 -0400 Subject: [PATCH] INT-2029 added support for dealing with Non Serializable message data. Added tests for non-String Messages --- .../redis/store/RedisMessageStore.java | 10 ++- .../redis/store/RedisMessageStoreTests.java | 66 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageStore.java b/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageStore.java index ce1d052c66..d6a283e870 100644 --- a/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageStore.java +++ b/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageStore.java @@ -29,6 +29,7 @@ import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import org.springframework.integration.Message; import org.springframework.integration.store.MessageStore; +import org.springframework.integration.store.MessageStoreException; import org.springframework.util.Assert; /** @@ -63,7 +64,14 @@ public class RedisMessageStore implements MessageStore, InitializingBean{ public Message addMessage(Message message) { Assert.notNull(message, "'message' must not be null"); BoundValueOperations> ops = redisTemplate.boundValueOps(message.getHeaders().getId()); - ops.set(message); + try { + ops.set(message); + } catch (SerializationException e) { + throw new MessageStoreException(message, "It seems like while relying on the default RedisSerializer (JdkSerializationRedisSerializer) " + + "the Message contains data that is not Serializable. Either make it Serializable or provide your own implementation of " + + "RedisSerializer via 'setValueSerializer(..)'", e); + } + return (Message) ops.get(); } diff --git a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageStoreTests.java b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageStoreTests.java index 30b642b133..196c53f4b6 100644 --- a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageStoreTests.java +++ b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageStoreTests.java @@ -15,6 +15,7 @@ */ package org.springframework.integration.redis.store; +import java.io.Serializable; import java.util.UUID; import org.junit.Test; @@ -23,6 +24,7 @@ import org.springframework.integration.Message; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.redis.rules.RedisAvailable; import org.springframework.integration.redis.rules.RedisAvailableTests; +import org.springframework.integration.store.MessageStoreException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -63,6 +65,31 @@ public class RedisMessageStoreTests extends RedisAvailableTests { assertEquals("Hello Redis", storedMessage.getPayload()); } + @Test + @RedisAvailable + public void testAddSerializableObjectMessage(){ + JedisConnectionFactory jcf = this.getConnectionFactoryForTest(); + RedisMessageStore store = new RedisMessageStore(jcf); + Address address = new Address(); + address.setAddress("1600 Pennsylvania Av, Washington, DC"); + Person person = new Person(address, "Barak Obama"); + + Message objectMessage = new GenericMessage(person); + Message storedMessage = store.addMessage(objectMessage); + assertNotSame(objectMessage, storedMessage); + assertEquals("Barak Obama", storedMessage.getPayload().getName()); + } + + @Test(expected=MessageStoreException.class) + @RedisAvailable + public void testAddNonSerializableObjectMessage(){ + JedisConnectionFactory jcf = this.getConnectionFactoryForTest(); + RedisMessageStore store = new RedisMessageStore(jcf); + + Message objectMessage = new GenericMessage(new Foo()); + store.addMessage(objectMessage); + } + @SuppressWarnings("unchecked") @Test @RedisAvailable @@ -88,6 +115,7 @@ public class RedisMessageStoreTests extends RedisAvailableTests { assertEquals("Hello Redis", retrievedMessage.getPayload()); assertNull(store.getMessage(stringMessage.getHeaders().getId())); } + @Test(expected=IllegalArgumentException.class) @RedisAvailable public void testRemoveNonExistingMessage(){ @@ -95,4 +123,42 @@ public class RedisMessageStoreTests extends RedisAvailableTests { RedisMessageStore store = new RedisMessageStore(jcf); store.removeMessage(UUID.randomUUID()); } + + @SuppressWarnings("serial") + public static class Person implements Serializable{ + private Address address; + public Address getAddress() { + return address; + } + public void setAddress(Address address) { + this.address = address; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + private String name; + public Person(Address address, String name){ + this.address = address; + this.name = name; + } + } + @SuppressWarnings("serial") + public static class Address implements Serializable{ + private String address; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + } + + public static class Foo{ + + } }