From 36bb568b0b5cf47fde266bfeb8be013a6ad40877 Mon Sep 17 00:00:00 2001 From: sangyongchoi Date: Sun, 25 Sep 2022 15:54:46 +0900 Subject: [PATCH 1/4] change to support automatic registration of converters --- .../data/mongodb/core/MongoTemplate.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 79ce56985a..a01eef8962 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -32,12 +32,14 @@ import org.bson.conversions.Bson; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.convert.converter.Converter; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.dao.DataAccessException; @@ -185,6 +187,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, private @Nullable EntityCallbacks entityCallbacks; private @Nullable ResourceLoader resourceLoader; private @Nullable MongoPersistentEntityIndexCreator indexCreator; + private @Nullable ListableBeanFactory listableBeanFactory; private SessionSynchronization sessionSynchronization = SessionSynchronization.ON_ACTUAL_TRANSACTION; @@ -331,7 +334,7 @@ public void setApplicationContext(ApplicationContext applicationContext) throws eventPublisher = applicationContext; eventDelegate.setPublisher(eventPublisher); - + listableBeanFactory = applicationContext; if (entityCallbacks == null) { setEntityCallbacks(EntityCallbacks.create(applicationContext)); } @@ -2761,11 +2764,15 @@ private MongoPersistentEntity getPersistentEntity(@Nullable Class type) { return type != null ? mappingContext.getPersistentEntity(type) : null; } - private static MongoConverter getDefaultMongoConverter(MongoDatabaseFactory factory) { + private MongoConverter getDefaultMongoConverter(MongoDatabaseFactory factory) { + List converters = listableBeanFactory + .getBeansOfType(Converter.class) + .values() + .stream() + .toList(); DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); - MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList()); - + MongoCustomConversions conversions = new MongoCustomConversions(converters); MongoMappingContext mappingContext = new MongoMappingContext(); mappingContext.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); mappingContext.afterPropertiesSet(); From 6c3ab1e2fe84b9c6b7ff9c70707aebca761e5058 Mon Sep 17 00:00:00 2001 From: sangyongchoi Date: Sun, 25 Sep 2022 16:13:34 +0900 Subject: [PATCH 2/4] change to support automatic registration of converters --- .../data/mongodb/core/MongoTemplate.java | 15 ++++++++++----- .../mongodb/core/ReactiveMongoTemplate.java | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index a01eef8962..2047c71561 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -2765,11 +2765,16 @@ private MongoPersistentEntity getPersistentEntity(@Nullable Class type) { } private MongoConverter getDefaultMongoConverter(MongoDatabaseFactory factory) { - List converters = listableBeanFactory - .getBeansOfType(Converter.class) - .values() - .stream() - .toList(); + List converters; + if (listableBeanFactory != null) { + converters = listableBeanFactory + .getBeansOfType(Converter.class) + .values() + .stream() + .toList(); + } else { + converters = Collections.emptyList(); + } DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MongoCustomConversions conversions = new MongoCustomConversions(converters); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index ac58269750..5fd89eed14 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -17,6 +17,8 @@ import static org.springframework.data.mongodb.core.query.SerializationUtils.*; +import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.core.convert.converter.Converter; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; @@ -185,6 +187,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati private @Nullable ApplicationEventPublisher eventPublisher; private @Nullable ReactiveEntityCallbacks entityCallbacks; private @Nullable ReactiveMongoPersistentEntityIndexCreator indexCreator; + private @Nullable ListableBeanFactory listableBeanFactory; private SessionSynchronization sessionSynchronization = SessionSynchronization.ON_ACTUAL_TRANSACTION; @@ -352,7 +355,7 @@ public void setApplicationContext(ApplicationContext applicationContext) throws eventPublisher = applicationContext; eventDelegate.setPublisher(eventPublisher); - + listableBeanFactory = applicationContext; if (entityCallbacks == null) { setEntityCallbacks(ReactiveEntityCallbacks.create(applicationContext)); } @@ -2581,8 +2584,18 @@ private MongoPersistentEntity getPersistentEntity(@Nullable Class type) { } private MappingMongoConverter getDefaultMongoConverter() { + List converters; + if (listableBeanFactory != null) { + converters = listableBeanFactory + .getBeansOfType(Converter.class) + .values() + .stream() + .toList(); + } else { + converters = Collections.emptyList(); + } - MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList()); + MongoCustomConversions conversions = new MongoCustomConversions(converters); MongoMappingContext context = new MongoMappingContext(); context.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); From 3dad976359894c84af0a7dc30f29d2b98faecad4 Mon Sep 17 00:00:00 2001 From: sangyongchoi Date: Sun, 25 Sep 2022 16:29:01 +0900 Subject: [PATCH 3/4] add author in the headers --- .../org/springframework/data/mongodb/core/MongoTemplate.java | 1 + .../springframework/data/mongodb/core/ReactiveMongoTemplate.java | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 2047c71561..ae3da3470c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -161,6 +161,7 @@ * @author Yadhukrishna S Pai * @author Anton Barkan * @author Bartłomiej Mazur + * @author Sangyong Choi */ public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index 5fd89eed14..2360dda212 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -159,6 +159,7 @@ * @author Roman Puchkovskiy * @author Mathieu Ouellet * @author Yadhukrishna S Pai + * @author Sangyong Choi * @since 2.0 */ public class ReactiveMongoTemplate implements ReactiveMongoOperations, ApplicationContextAware { From b38839587ff150010189e0b4a1a058f23337cd25 Mon Sep 17 00:00:00 2001 From: sangyongchoi Date: Tue, 27 Sep 2022 18:33:24 +0900 Subject: [PATCH 4/4] add DocumentFieldConverter interface --- .../data/mongodb/core/MongoTemplate.java | 15 +++--------- .../mongodb/core/ReactiveMongoTemplate.java | 13 +++------- .../core/convert/DocumentFieldConverter.java | 24 +++++++++++++++++++ 3 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DocumentFieldConverter.java diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index ae3da3470c..31310a41b1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -72,16 +72,7 @@ import org.springframework.data.mongodb.core.aggregation.AggregationPipeline; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.aggregation.TypedAggregation; -import org.springframework.data.mongodb.core.convert.DbRefResolver; -import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; -import org.springframework.data.mongodb.core.convert.JsonSchemaMapper; -import org.springframework.data.mongodb.core.convert.MappingMongoConverter; -import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.core.convert.MongoCustomConversions; -import org.springframework.data.mongodb.core.convert.MongoJsonSchemaMapper; -import org.springframework.data.mongodb.core.convert.MongoWriter; -import org.springframework.data.mongodb.core.convert.QueryMapper; -import org.springframework.data.mongodb.core.convert.UpdateMapper; +import org.springframework.data.mongodb.core.convert.*; import org.springframework.data.mongodb.core.index.IndexOperations; import org.springframework.data.mongodb.core.index.IndexOperationsProvider; import org.springframework.data.mongodb.core.index.MongoMappingEventPublisher; @@ -2766,10 +2757,10 @@ private MongoPersistentEntity getPersistentEntity(@Nullable Class type) { } private MongoConverter getDefaultMongoConverter(MongoDatabaseFactory factory) { - List converters; + List converters; if (listableBeanFactory != null) { converters = listableBeanFactory - .getBeansOfType(Converter.class) + .getBeansOfType(DocumentFieldConverter.class) .values() .stream() .toList(); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index 2360dda212..7c796c7a7b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -19,6 +19,7 @@ import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.core.convert.converter.Converter; +import org.springframework.data.mongodb.core.convert.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; @@ -87,14 +88,6 @@ import org.springframework.data.mongodb.core.aggregation.RelaxedTypeBasedAggregationOperationContext; import org.springframework.data.mongodb.core.aggregation.TypeBasedAggregationOperationContext; import org.springframework.data.mongodb.core.aggregation.TypedAggregation; -import org.springframework.data.mongodb.core.convert.DbRefResolver; -import org.springframework.data.mongodb.core.convert.MappingMongoConverter; -import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.core.convert.MongoCustomConversions; -import org.springframework.data.mongodb.core.convert.MongoWriter; -import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; -import org.springframework.data.mongodb.core.convert.QueryMapper; -import org.springframework.data.mongodb.core.convert.UpdateMapper; import org.springframework.data.mongodb.core.index.MongoMappingEventPublisher; import org.springframework.data.mongodb.core.index.ReactiveIndexOperations; import org.springframework.data.mongodb.core.index.ReactiveMongoPersistentEntityIndexCreator; @@ -2585,10 +2578,10 @@ private MongoPersistentEntity getPersistentEntity(@Nullable Class type) { } private MappingMongoConverter getDefaultMongoConverter() { - List converters; + List converters; if (listableBeanFactory != null) { converters = listableBeanFactory - .getBeansOfType(Converter.class) + .getBeansOfType(DocumentFieldConverter.class) .values() .stream() .toList(); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DocumentFieldConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DocumentFieldConverter.java new file mode 100644 index 0000000000..1b5ddf3d0f --- /dev/null +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DocumentFieldConverter.java @@ -0,0 +1,24 @@ +/* + * Copyright 2011-2022 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.mongodb.core.convert; + +import org.springframework.core.convert.converter.Converter; + +/** + * @author Sangyong choi + */ +public interface DocumentFieldConverter extends Converter { +}