diff --git a/spring-session/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java b/spring-session/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java index cc4ec8b..d0d64ba 100644 --- a/spring-session/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java +++ b/spring-session/src/main/java/org/springframework/session/data/mongo/JdkMongoSessionConverter.java @@ -15,37 +15,31 @@ */ package org.springframework.session.data.mongo; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.core.serializer.DefaultDeserializer; -import org.springframework.core.serializer.DefaultSerializer; -import org.springframework.core.serializer.Deserializer; -import org.springframework.core.serializer.Serializer; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.serializer.support.DeserializingConverter; +import org.springframework.core.serializer.support.SerializingConverter; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.session.Session; +import org.springframework.util.Assert; /** * {@code AbstractMongoSessionConverter} implementation using standard Java serialization. * * @author Jakub Kubrynski + * @author Rob Winch * @since 1.2 */ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { - private static final Log LOG = LogFactory.getLog(JdkMongoSessionConverter.class); - private static final String ID = "_id"; private static final String CREATION_TIME = "created"; private static final String LAST_ACCESSED_TIME = "accessed"; @@ -54,14 +48,17 @@ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { private static final String PRINCIPAL_FIELD_NAME = "principal"; - private final Serializer serializer; - private final Deserializer deserializer; + private final Converter serializer; + private final Converter deserializer; public JdkMongoSessionConverter() { - this(new DefaultSerializer(), new DefaultDeserializer()); + this(new SerializingConverter(), new DeserializingConverter()); } - public JdkMongoSessionConverter(Serializer serializer, Deserializer deserializer) { + public JdkMongoSessionConverter(Converter serializer, + Converter deserializer) { + Assert.notNull(serializer, "serializer cannot be null"); + Assert.notNull(deserializer, "deserializer cannot be null"); this.serializer = serializer; this.deserializer = deserializer; } @@ -100,37 +97,21 @@ public class JdkMongoSessionConverter extends AbstractMongoSessionConverter { return session; } - @SuppressWarnings("unchecked") private byte[] serializeAttributes(Session session) { - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - Map attributes = new HashMap(); - for (String attrName : session.getAttributeNames()) { - attributes.put(attrName, session.getAttribute(attrName)); - } - this.serializer.serialize(attributes, out); - return out.toByteArray(); - } - catch (IOException e) { - LOG.error("Exception during session serialization", e); - throw new IllegalStateException("Cannot serialize session", e); + Map attributes = new HashMap(); + for (String attrName : session.getAttributeNames()) { + attributes.put(attrName, session.getAttribute(attrName)); } + return this.serializer.convert(attributes); } @SuppressWarnings("unchecked") private void deserializeAttributes(DBObject sessionWrapper, Session session) { - try { - ByteArrayInputStream in = new ByteArrayInputStream( - (byte[]) sessionWrapper.get(ATTRIBUTES)); - Map attributes = - (Map) this.deserializer.deserialize(in); - for (Map.Entry entry : attributes.entrySet()) { - session.setAttribute(entry.getKey(), entry.getValue()); - } - } - catch (IOException e) { - LOG.error("Exception during session deserialization", e); - throw new IllegalStateException("Cannot deserialize session", e); + byte[] attributesBytes = (byte[]) sessionWrapper.get(ATTRIBUTES); + Map attributes = (Map) this.deserializer + .convert(attributesBytes); + for (Map.Entry entry : attributes.entrySet()) { + session.setAttribute(entry.getKey(), entry.getValue()); } } diff --git a/spring-session/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTests.java b/spring-session/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTests.java index 83c1e78..bd206e3 100644 --- a/spring-session/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTests.java +++ b/spring-session/src/test/java/org/springframework/session/data/mongo/JdkMongoSessionConverterTests.java @@ -19,6 +19,8 @@ import com.mongodb.DBObject; import org.junit.Test; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.core.serializer.support.DeserializingConverter; +import org.springframework.core.serializer.support.SerializingConverter; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextImpl; import org.springframework.session.ExpiringSession; @@ -28,11 +30,22 @@ import static org.assertj.core.api.Assertions.assertThat; /** * @author Jakub Kubrynski + * @author Rob Winch */ public class JdkMongoSessionConverterTests { JdkMongoSessionConverter sut = new JdkMongoSessionConverter(); + @Test(expected = IllegalArgumentException.class) + public void constructorNullSerializer() { + new JdkMongoSessionConverter(null, new DeserializingConverter()); + } + + @Test(expected = IllegalArgumentException.class) + public void constructorNullDeserializer() { + new JdkMongoSessionConverter(new SerializingConverter(), null); + } + @Test public void verifyRoundTripSerialization() throws Exception { // given