From 848d7c16c1a0302f0d64897f0adae861a801f9cc Mon Sep 17 00:00:00 2001 From: xiao Date: Mon, 2 Sep 2024 19:07:10 +0800 Subject: [PATCH] Optimize the usage of JacksonMongoSessionConverter to prevent duplicate MongoSession Document saves when a custom ObjectMapper is provided.https://github.com/spring-projects/spring-session/issues/3185 --- .../mongo/JacksonMongoSessionConverter.java | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/spring-session-data-mongodb/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java b/spring-session-data-mongodb/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java index 986634200..8dfdb5abb 100644 --- a/spring-session-data-mongodb/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java +++ b/spring-session-data-mongodb/src/main/java/org/springframework/session/data/mongo/JacksonMongoSessionConverter.java @@ -16,11 +16,6 @@ package org.springframework.session.data.mongo; -import java.io.IOException; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; - import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -37,7 +32,6 @@ import org.bson.Document; import org.bson.json.JsonMode; import org.bson.json.JsonWriterSettings; - import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.lang.Nullable; @@ -45,6 +39,11 @@ import org.springframework.session.FindByIndexNameSessionRepository; import org.springframework.util.Assert; +import java.io.IOException; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; + /** * {@code AbstractMongoSessionConverter} implementation using Jackson. * @@ -76,11 +75,22 @@ public JacksonMongoSessionConverter(Iterable modules) { } public JacksonMongoSessionConverter(ObjectMapper objectMapper) { - - Assert.notNull(objectMapper, "ObjectMapper can NOT be null!"); + Assert.notNull(objectMapper, "ObjectMapper can not be null!"); this.objectMapper = objectMapper; } + public JacksonMongoSessionConverter(ObjectMapper objectMapper, boolean copyToUse) { + Assert.notNull(objectMapper, "ObjectMapper can not be null!"); + if (!copyToUse) { + configureObjectMapper(objectMapper); + this.objectMapper = objectMapper; + return; + } + var objectMapperCopy = objectMapper.copy(); + configureObjectMapper(objectMapperCopy); + this.objectMapper = objectMapperCopy; + } + @Nullable protected Query getQueryForIndex(String indexName, Object indexValue) { @@ -93,9 +103,12 @@ protected Query getQueryForIndex(String indexName, Object indexValue) { } private ObjectMapper buildObjectMapper() { - ObjectMapper objectMapper = new ObjectMapper(); + this.configureObjectMapper(objectMapper); + return objectMapper; + } + private void configureObjectMapper(ObjectMapper objectMapper) { // serialize fields instead of properties objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); @@ -108,8 +121,6 @@ private ObjectMapper buildObjectMapper() { objectMapper.registerModules(SecurityJackson2Modules.getModules(getClass().getClassLoader())); objectMapper.addMixIn(MongoSession.class, MongoSessionMixin.class); objectMapper.addMixIn(HashMap.class, HashMapMixin.class); - - return objectMapper; } @Override