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..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 @@ -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; @@ -70,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; @@ -159,6 +152,7 @@ * @author Yadhukrishna S Pai * @author Anton Barkan * @author Bartłomiej Mazur + * @author Sangyong Choi */ public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider { @@ -185,6 +179,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 +326,7 @@ public void setApplicationContext(ApplicationContext applicationContext) throws eventPublisher = applicationContext; eventDelegate.setPublisher(eventPublisher); - + listableBeanFactory = applicationContext; if (entityCallbacks == null) { setEntityCallbacks(EntityCallbacks.create(applicationContext)); } @@ -2761,11 +2756,20 @@ 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; + if (listableBeanFactory != null) { + converters = listableBeanFactory + .getBeansOfType(DocumentFieldConverter.class) + .values() + .stream() + .toList(); + } else { + converters = Collections.emptyList(); + } 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(); 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..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 @@ -17,6 +17,9 @@ import static org.springframework.data.mongodb.core.query.SerializationUtils.*; +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; @@ -85,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; @@ -157,6 +152,7 @@ * @author Roman Puchkovskiy * @author Mathieu Ouellet * @author Yadhukrishna S Pai + * @author Sangyong Choi * @since 2.0 */ public class ReactiveMongoTemplate implements ReactiveMongoOperations, ApplicationContextAware { @@ -185,6 +181,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 +349,7 @@ public void setApplicationContext(ApplicationContext applicationContext) throws eventPublisher = applicationContext; eventDelegate.setPublisher(eventPublisher); - + listableBeanFactory = applicationContext; if (entityCallbacks == null) { setEntityCallbacks(ReactiveEntityCallbacks.create(applicationContext)); } @@ -2581,8 +2578,18 @@ private MongoPersistentEntity getPersistentEntity(@Nullable Class type) { } private MappingMongoConverter getDefaultMongoConverter() { + List converters; + if (listableBeanFactory != null) { + converters = listableBeanFactory + .getBeansOfType(DocumentFieldConverter.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()); 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 { +}