diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableAggregationOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableAggregationOperation.java index e4becc491..57813a75b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableAggregationOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableAggregationOperation.java @@ -89,7 +89,7 @@ public interface ExecutableAggregationOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link TerminatingAggregation}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingAggregation map(QueryResultConverter converter); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java index 2fff730ad..43c0d521c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableFindOperation.java @@ -84,7 +84,7 @@ public interface ExecutableFindOperation { * * @author Christoph Strobl * @author Mark Paluch - * @since x.y + * @since 5.0 */ interface TerminatingResults { @@ -95,7 +95,7 @@ public interface ExecutableFindOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link TerminatingResults}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingResults map(QueryResultConverter converter); @@ -157,7 +157,7 @@ public interface ExecutableFindOperation { *

* When using {@link KeysetScrollPosition}, make sure to use non-nullable * {@link org.springframework.data.domain.Sort sort properties} as MongoDB does not support criteria to reconstruct - * a query result from absent document fields or {@code null} values through {@code $gt/$lt} operators. + * a query result from absent document fields or {@literal null} values through {@code $gt/$lt} operators. * * @param scrollPosition the scroll position. * @return a window of the resulting elements. @@ -173,7 +173,7 @@ public interface ExecutableFindOperation { * Trigger find execution by calling one of the terminating methods. * * @author Christoph Strobl - * @since x.y + * @since 5.0 */ interface TerminatingProjection { @@ -214,7 +214,7 @@ public interface ExecutableFindOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link TerminatingFindNear}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingFindNear map(QueryResultConverter converter); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableRemoveOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableRemoveOperation.java index 9f4a0109e..de591a0fa 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableRemoveOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableRemoveOperation.java @@ -64,7 +64,7 @@ public interface ExecutableRemoveOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link ExecutableFindOperation.TerminatingResults}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingResults map(QueryResultConverter converter); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperation.java index 925a1af80..e671b7b7c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperation.java @@ -18,15 +18,15 @@ package org.springframework.data.mongodb.core; import java.util.Optional; import org.jspecify.annotations.Nullable; -import org.springframework.data.mongodb.core.ExecutableFindOperation.TerminatingResults; + import org.springframework.data.mongodb.core.aggregation.AggregationUpdate; import org.springframework.data.mongodb.core.query.CriteriaDefinition; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.query.UpdateDefinition; +import org.springframework.lang.Contract; import com.mongodb.client.result.UpdateResult; -import org.springframework.lang.Contract; /** * {@link ExecutableUpdateOperation} allows creation and execution of MongoDB update / findAndModify / findAndReplace @@ -71,7 +71,6 @@ public interface ExecutableUpdateOperation { */ interface TerminatingFindAndModify { - /** * Map the query result to a different type using {@link QueryResultConverter}. * @@ -79,7 +78,7 @@ public interface ExecutableUpdateOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link TerminatingFindAndModify}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingFindAndModify map(QueryResultConverter converter); @@ -153,10 +152,11 @@ public interface ExecutableUpdateOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link TerminatingFindAndModify}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") - TerminatingFindAndReplace mapResult(QueryResultConverter converter); + TerminatingFindAndReplace map(QueryResultConverter converter); + } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupport.java index 56bef3815..dc9ce5cac 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupport.java @@ -185,16 +185,9 @@ class ExecutableUpdateOperationSupport implements ExecutableUpdateOperation { } @Override - public TerminatingFindAndModify map(QueryResultConverter converter) { - - return new ExecutableUpdateSupport<>(template, domainType, query, update, collection, findAndModifyOptions, - findAndReplaceOptions, replacement, targetType, this.resultConverter.andThen(converter)); - } - - @Override - public TerminatingFindAndReplace mapResult(QueryResultConverter converter) { + public ExecutableUpdateSupport map(QueryResultConverter converter) { return new ExecutableUpdateSupport<>(template, domainType, query, update, collection, findAndModifyOptions, - findAndReplaceOptions, replacement, targetType, this.resultConverter.andThen(converter)); + findAndReplaceOptions, replacement, targetType, this.resultConverter.andThen(converter)); } @Override diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java index 7fdd15752..6753f31c1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoOperations.java @@ -822,7 +822,7 @@ public interface MongoOperations extends FluentMongoOperations { *

* When using {@link KeysetScrollPosition}, make sure to use non-nullable {@link org.springframework.data.domain.Sort * sort properties} as MongoDB does not support criteria to reconstruct a query result from absent document fields or - * {@code null} values through {@code $gt/$lt} operators. + * {@literal null} values through {@code $gt/$lt} operators. * * @param query the query class that specifies the criteria used to find a document and also an optional fields * specification. Must not be {@literal null}. @@ -847,7 +847,7 @@ public interface MongoOperations extends FluentMongoOperations { *

* When using {@link KeysetScrollPosition}, make sure to use non-nullable {@link org.springframework.data.domain.Sort * sort properties} as MongoDB does not support criteria to reconstruct a query result from absent document fields or - * {@code null} values through {@code $gt/$lt} operators. + * {@literal null} values through {@code $gt/$lt} operators. * * @param query the query class that specifies the criteria used to find a document and also an optional fields * specification. Must not be {@literal null}. 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 5c9f38282..e5c7f9510 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 @@ -15,22 +15,12 @@ */ package org.springframework.data.mongodb.core; -import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; +import static org.springframework.data.mongodb.core.query.SerializationUtils.*; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Scanner; -import java.util.Set; +import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.BiPredicate; import java.util.stream.Collectors; @@ -40,8 +30,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bson.Document; import org.bson.conversions.Bson; - import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -106,18 +96,7 @@ import org.springframework.data.mongodb.core.index.SearchIndexOperationsProvider import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; -import org.springframework.data.mongodb.core.mapping.event.AfterConvertCallback; -import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent; -import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent; -import org.springframework.data.mongodb.core.mapping.event.AfterLoadEvent; -import org.springframework.data.mongodb.core.mapping.event.AfterSaveCallback; -import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; -import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback; -import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent; -import org.springframework.data.mongodb.core.mapping.event.BeforeDeleteEvent; -import org.springframework.data.mongodb.core.mapping.event.BeforeSaveCallback; -import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent; -import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent; +import org.springframework.data.mongodb.core.mapping.event.*; import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions; import org.springframework.data.mongodb.core.mapreduce.MapReduceResults; import org.springframework.data.mongodb.core.query.BasicQuery; @@ -157,21 +136,7 @@ import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoIterable; -import com.mongodb.client.model.CountOptions; -import com.mongodb.client.model.CreateCollectionOptions; -import com.mongodb.client.model.CreateViewOptions; -import com.mongodb.client.model.DeleteOptions; -import com.mongodb.client.model.EstimatedDocumentCountOptions; -import com.mongodb.client.model.FindOneAndDeleteOptions; -import com.mongodb.client.model.FindOneAndReplaceOptions; -import com.mongodb.client.model.FindOneAndUpdateOptions; -import com.mongodb.client.model.ReturnDocument; -import com.mongodb.client.model.TimeSeriesGranularity; -import com.mongodb.client.model.TimeSeriesOptions; -import com.mongodb.client.model.UpdateOptions; -import com.mongodb.client.model.ValidationAction; -import com.mongodb.client.model.ValidationLevel; -import com.mongodb.client.model.ValidationOptions; +import com.mongodb.client.model.*; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; @@ -1148,7 +1113,6 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, return findAndModify(query, update, options, entityClass, collectionName, QueryResultConverter.entity()); } - T findAndModify(Query query, UpdateDefinition update, FindAndModifyOptions options, Class entityClass, String collectionName, QueryResultConverter resultConverter) { @@ -1179,7 +1143,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, return findAndReplace(query, replacement, options, entityType, collectionName, resultType, QueryResultConverter.entity()); } - public @Nullable R findAndReplace(Query query, S replacement, FindAndReplaceOptions options, + @Nullable R findAndReplace(Query query, S replacement, FindAndReplaceOptions options, Class entityType, String collectionName, Class resultType, QueryResultConverter resultConverter) { Assert.notNull(query, "Query must not be null"); @@ -1207,7 +1171,6 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, maybeEmitEvent(new BeforeSaveEvent<>(replacement, mappedReplacement, collectionName)); maybeCallBeforeSave(replacement, mappedReplacement, collectionName); - R saved = doFindAndReplace(collectionPreparer, collectionName, mappedQuery, mappedFields, mappedSort, queryContext.getCollation(entityType).orElse(null), entityType, mappedReplacement, options, projection, resultConverter); @@ -2203,25 +2166,15 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, return doFindAndDelete(collectionName, query, entityClass, QueryResultConverter.entity()); } - protected List doFindAndDelete(String collectionName, Query query, Class entityClass, QueryResultConverter resultConverter) { + List doFindAndDelete(String collectionName, Query query, Class entityClass, + QueryResultConverter resultConverter) { List ids = new ArrayList<>(); - - -// QueryResultConverter tmpConverter = new QueryResultConverter() { -// @Override -// public S mapDocument(Document document, ConversionResultSupplier reader) { -// ids.add(document.get("_id")); -// return reader.get(); -// } -// }.andThen(resultConverter); - -// DocumentCallback callback = getResultReader(EntityProjection.nonProjecting(entityClass), collectionName, tmpConverter); - - QueryResultConverterCallback callback = new QueryResultConverterCallback(resultConverter, new ProjectingReadCallback(getConverter(), EntityProjection.nonProjecting(entityClass), collectionName)) { + QueryResultConverterCallback callback = new QueryResultConverterCallback<>(resultConverter, + new ProjectingReadCallback<>(getConverter(), EntityProjection.nonProjecting(entityClass), collectionName)) { @Override - public Object doWith(Document object) { + public T doWith(Document object) { ids.add(object.get("_id")); return super.doWith(object); } @@ -2366,7 +2319,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, } @SuppressWarnings({ "ConstantConditions", "NullAway" }) - protected Stream doAggregateStream(Aggregation aggregation, String collectionName, Class outputType, + Stream doAggregateStream(Aggregation aggregation, String collectionName, Class outputType, QueryResultConverter resultConverter, @Nullable AggregationOperationContext context) { @@ -2412,7 +2365,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, cursor = cursor.maxTime(options.getMaxTime().toMillis(), TimeUnit.MILLISECONDS); } - Class domainType = aggregation instanceof TypedAggregation typedAggregation ? typedAggregation.getInputType() + Class domainType = aggregation instanceof TypedAggregation typedAggregation + ? typedAggregation.getInputType() : null; Optionals.firstNonEmpty(options::getCollation, // @@ -2863,7 +2817,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, } @SuppressWarnings("ConstantConditions") - protected @Nullable T doFindAndModify(CollectionPreparer collectionPreparer, String collectionName, + @Nullable T doFindAndModify(CollectionPreparer> collectionPreparer, + String collectionName, Document query, @Nullable Document fields, @Nullable Document sort, Class entityClass, UpdateDefinition update, @Nullable FindAndModifyOptions options, QueryResultConverter resultConverter) { @@ -2911,7 +2866,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, * {@literal false} and {@link FindAndReplaceOptions#isUpsert() upsert} is {@literal false}. */ @Nullable - protected T doFindAndReplace(CollectionPreparer collectionPreparer, String collectionName, + protected T doFindAndReplace(CollectionPreparer> collectionPreparer, + String collectionName, Document mappedQuery, Document mappedFields, Document mappedSort, com.mongodb.client.model.@Nullable Collation collation, Class entityType, Document replacement, FindAndReplaceOptions options, Class resultType) { @@ -2954,7 +2910,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, * @since 3.4 */ @Nullable - private R doFindAndReplace(CollectionPreparer collectionPreparer, String collectionName, + private R doFindAndReplace(CollectionPreparer> collectionPreparer, + String collectionName, Document mappedQuery, Document mappedFields, Document mappedSort, com.mongodb.client.model.@Nullable Collation collation, Class entityType, Document replacement, FindAndReplaceOptions options, EntityProjection projection, QueryResultConverter resultConverter) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryResultConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryResultConverter.java index e271ee23c..ca93940a9 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryResultConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryResultConverter.java @@ -28,7 +28,7 @@ import org.bson.Document; * @param object type accepted by this converter. * @param the returned result type. * @author Mark Paluch - * @since x.x + * @since 5.0 */ @FunctionalInterface public interface QueryResultConverter { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveAggregationOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveAggregationOperation.java index 883bc6557..99c94b19e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveAggregationOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveAggregationOperation.java @@ -81,7 +81,7 @@ public interface ReactiveAggregationOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link ExecutableFindOperation.TerminatingFindNear}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingAggregationOperation map(QueryResultConverter converter); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveFindOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveFindOperation.java index 24d8c975b..eaa9da4a3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveFindOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveFindOperation.java @@ -74,7 +74,7 @@ public interface ReactiveFindOperation { /** * Compose find execution by calling one of the terminating methods. * - * @since x.y + * @since 5.0 */ interface TerminatingResults { @@ -85,7 +85,7 @@ public interface ReactiveFindOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link TerminatingResults}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingResults map(QueryResultConverter converter); @@ -117,7 +117,7 @@ public interface ReactiveFindOperation { *

* When using {@link KeysetScrollPosition}, make sure to use non-nullable * {@link org.springframework.data.domain.Sort sort properties} as MongoDB does not support criteria to reconstruct - * a query result from absent document fields or {@code null} values through {@code $gt/$lt} operators. + * a query result from absent document fields or {@literal null} values through {@code $gt/$lt} operators. * * @param scrollPosition the scroll position. * @return a scroll of the resulting elements. @@ -147,7 +147,7 @@ public interface ReactiveFindOperation { /** * Compose find execution by calling one of the terminating methods. * - * @since x.y + * @since 5.0 */ interface TerminatingProjection { @@ -183,7 +183,7 @@ public interface ReactiveFindOperation { * @param converter the converter, must not be {@literal null}. * @return new instance of {@link ExecutableFindOperation.TerminatingFindNear}. * @throws IllegalArgumentException if {@link QueryResultConverter converter} is {@literal null}. - * @since x.y + * @since 5.0 */ @Contract("_ -> new") TerminatingFindNear map(QueryResultConverter converter); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java index ebec41e3a..14f6ee263 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoOperations.java @@ -513,7 +513,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations { *

* When using {@link KeysetScrollPosition}, make sure to use non-nullable {@link org.springframework.data.domain.Sort * sort properties} as MongoDB does not support criteria to reconstruct a query result from absent document fields or - * {@code null} values through {@code $gt/$lt} operators. + * {@literal null} values through {@code $gt/$lt} operators. * * @param query the query class that specifies the criteria used to find a document and also an optional fields * specification. Must not be {@literal null}. @@ -538,7 +538,7 @@ public interface ReactiveMongoOperations extends ReactiveFluentMongoOperations { *

* When using {@link KeysetScrollPosition}, make sure to use non-nullable {@link org.springframework.data.domain.Sort * sort properties} as MongoDB does not support criteria to reconstruct a query result from absent document fields or - * {@code null} values through {@code $gt/$lt} operators. + * {@literal null} values through {@code $gt/$lt} operators. * * @param query the query class that specifies the criteria used to find a document and also an optional fields * specification. Must not be {@literal null}. 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 80b842a5e..eb372c6b9 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 @@ -15,7 +15,7 @@ */ package org.springframework.data.mongodb.core; -import static org.springframework.data.mongodb.core.query.SerializationUtils.serializeToJsonSafely; +import static org.springframework.data.mongodb.core.query.SerializationUtils.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -47,6 +47,7 @@ import org.bson.types.ObjectId; import org.jspecify.annotations.Nullable; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -109,18 +110,7 @@ import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; import org.springframework.data.mongodb.core.mapping.MongoSimpleTypes; -import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent; -import org.springframework.data.mongodb.core.mapping.event.AfterDeleteEvent; -import org.springframework.data.mongodb.core.mapping.event.AfterLoadEvent; -import org.springframework.data.mongodb.core.mapping.event.AfterSaveEvent; -import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent; -import org.springframework.data.mongodb.core.mapping.event.BeforeDeleteEvent; -import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent; -import org.springframework.data.mongodb.core.mapping.event.MongoMappingEvent; -import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterConvertCallback; -import org.springframework.data.mongodb.core.mapping.event.ReactiveAfterSaveCallback; -import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeConvertCallback; -import org.springframework.data.mongodb.core.mapping.event.ReactiveBeforeSaveCallback; +import org.springframework.data.mongodb.core.mapping.event.*; import org.springframework.data.mongodb.core.mapreduce.MapReduceOptions; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Collation; @@ -2772,7 +2762,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati DocumentCallback readCallback = new ProjectingReadCallback<>(mongoConverter, projection, collectionName); return resultConverter == QueryResultConverter.entity() ? (DocumentCallback) readCallback - : new QueryResultConverterCallback(resultConverter, readCallback); + : new QueryResultConverterCallback<>(resultConverter, readCallback); } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/geo/GeoJsonModule.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/geo/GeoJsonModule.java index cfae6761a..5c458329a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/geo/GeoJsonModule.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/geo/GeoJsonModule.java @@ -19,7 +19,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; + import org.jspecify.annotations.Nullable; + import org.springframework.data.geo.Point; import com.fasterxml.jackson.core.JsonParser; @@ -163,7 +165,7 @@ public class GeoJsonModule extends SimpleModule { * {@literal x - coordinate} and {@code node.[1]} is {@literal y}. * * @param node can be {@literal null}. - * @return {@literal null} when given a {@code null} value. + * @return {@literal null} when given a {@literal null} value. */ protected @Nullable GeoJsonPoint toGeoJsonPoint(@Nullable ArrayNode node) { @@ -179,7 +181,7 @@ public class GeoJsonModule extends SimpleModule { * {@literal x - coordinate} and {@code node.[1]} is {@literal y}. * * @param node can be {@literal null}. - * @return {@literal null} when given a {@code null} value. + * @return {@literal null} when given a {@literal null} value. */ protected @Nullable Point toPoint(@Nullable ArrayNode node) { @@ -194,7 +196,7 @@ public class GeoJsonModule extends SimpleModule { * Get the points nested within given {@link ArrayNode}. * * @param node can be {@literal null}. - * @return {@literal empty list} when given a {@code null} value. + * @return {@literal empty list} when given a {@literal null} value. */ protected List toPoints(@Nullable ArrayNode node) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java index 3f63009ae..b7beaaa3e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/index/MongoPersistentEntityIndexResolver.java @@ -110,7 +110,7 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver { * {@link GeospatialIndex}. The given {@literal root} has therefore to be annotated with {@link Document}. * * @param root must not be null. - * @return List of {@link IndexDefinitionHolder}. Will never be {@code null}. + * @return List of {@link IndexDefinitionHolder}. Will never be {@literal null}. * @throws IllegalArgumentException in case of missing {@link Document} annotation marking root entities. */ public List resolveIndexForEntity(MongoPersistentEntity root) { @@ -189,7 +189,7 @@ public class MongoPersistentEntityIndexResolver implements IndexResolver { * @param collection * @param guard * @return List of {@link IndexDefinitionHolder} representing indexes for given type and its referenced property - * types. Will never be {@code null}. + * types. Will never be {@literal null}. */ private List resolveIndexForClass(TypeInformation type, String dotPath, Path path, String collection, CycleGuard guard) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java index 52c5e3255..6c90746fe 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/MongoQueryMethod.java @@ -191,7 +191,7 @@ public class MongoQueryMethod extends QueryMethod { } /** - * Returns the {@link Query} annotation that is applied to the method or {@code null} if none available. + * Returns the {@link Query} annotation that is applied to the method or {@literal null} if none available. * * @return */ @@ -217,7 +217,7 @@ public class MongoQueryMethod extends QueryMethod { } /** - * Returns the {@link Meta} annotation that is applied to the method or {@code null} if not available. + * Returns the {@link Meta} annotation that is applied to the method or {@literal null} if not available. * * @return * @since 1.6 @@ -228,7 +228,7 @@ public class MongoQueryMethod extends QueryMethod { } /** - * Returns the {@link Tailable} annotation that is applied to the method or {@code null} if not available. + * Returns the {@link Tailable} annotation that is applied to the method or {@literal null} if not available. * * @return * @since 2.0 diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java index 3f7e167bd..835367990 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableFindOperationSupportTests.java @@ -172,7 +172,7 @@ class ExecutableFindOperationSupportTests implements StateFunctions { .hasOnlyElementsOfType(Jedi.class).hasSize(1); } - @Test // GH- + @Test // GH-4949 void findAllByWithConverter() { List> result = template.query(Person.class).as(Jedi.class) @@ -272,7 +272,7 @@ class ExecutableFindOperationSupportTests implements StateFunctions { } } - @Test // GH- + @Test // GH-4949 void streamAllWithConverter() { try (Stream> stream = template.query(Person.class).as(Jedi.class) @@ -336,7 +336,7 @@ class ExecutableFindOperationSupportTests implements StateFunctions { assertThat(results.getContent().get(0).getContent().getId()).isEqualTo("alderan"); } - @Test // GH- + @Test // GH-4949 void findAllNearByWithConverter() { GeoResults> results = template.query(Object.class).inCollection(STAR_WARS_PLANETS).as(Human.class) diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableRemoveOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableRemoveOperationSupportTests.java index 54a477300..fe1967206 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableRemoveOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableRemoveOperationSupportTests.java @@ -109,7 +109,7 @@ class ExecutableRemoveOperationSupportTests { assertThat(result).containsExactly(han); } - @Test // GH-0 + @Test // GH-4949 void removeAndReturnAllMatchingWithResultConverter() { List> result = template.remove(Person.class).matching(query(where("firstname").is("han"))).map((raw, converted) -> Optional.of(converted.get())).findAndRemove(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupportTests.java index 86c4693c3..3e7fa6c2b 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ExecutableUpdateOperationSupportTests.java @@ -293,14 +293,14 @@ class ExecutableUpdateOperationSupportTests { assertThat(result.getName()).isEqualTo(han.firstname); } - @Test // GH- + @Test // GH-4949 void findAndReplaceWithResultConverter() { Person luke = new Person(); luke.firstname = "Luke"; Optional result = template.update(Person.class).matching(queryHan()).replaceWith(luke).as(Jedi.class) // - .mapResult((raw, converted) -> Optional.of(converted.get())) + .map((raw, converted) -> Optional.of(converted.get())) .findAndReplaceValue(); assertThat(result.get()).isInstanceOf(Jedi.class).extracting(Jedi::getName).isEqualTo(han.firstname); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryResultConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryResultConverterUnitTests.java index c94a9fab0..107b94216 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryResultConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/QueryResultConverterUnitTests.java @@ -15,13 +15,16 @@ */ package org.springframework.data.mongodb.core; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import org.bson.Document; import org.junit.jupiter.api.Test; + import org.springframework.data.mongodb.core.QueryResultConverter.ConversionResultSupplier; /** + * Unit tests for {@link QueryResultConverter}. + * * @author Christoph Strobl */ class QueryResultConverterUnitTests { @@ -30,7 +33,7 @@ class QueryResultConverterUnitTests { throw new IllegalStateException("must not read conversion result"); }; - @Test // GH- + @Test // GH-4949 void converterDoesNotEagerlyRetrieveConversionResultFromSupplier() { QueryResultConverter converter = new QueryResultConverter() { @@ -44,7 +47,7 @@ class QueryResultConverterUnitTests { assertThat(converter.mapDocument(new Document(), ERROR_SUPPLIER)).isEqualTo("done"); } - @Test // GH- + @Test // GH-4949 void converterPassesOnConversionResultToNextStage() { Document source = new Document("value", "10"); @@ -68,7 +71,7 @@ class QueryResultConverterUnitTests { assertThat(stagedConverter.mapDocument(source, ERROR_SUPPLIER)).isEqualTo(10); } - @Test // GH- + @Test // GH-4949 void entityConverterDelaysConversion() { Document source = new Document("value", "10"); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java index 28b77cdfa..7f015874d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveFindOperationSupportTests.java @@ -168,7 +168,7 @@ class ReactiveFindOperationSupportTests implements StateFunctions { .verifyComplete(); } - @Test // GH-… + @Test // GH-4949 void findAllWithConverter() { template.query(Person.class).as(Jedi.class).map((document, reader) -> Optional.of(reader.get())).all() diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java index 95a29fe8b..1495dec1c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AggregationTests.java @@ -288,7 +288,7 @@ public class AggregationTests { } } - @Test // GH- + @Test // GH-4949 void shouldAggregateAsStreamWithConverter() { MongoCollection coll = mongoTemplate.getCollection(INPUT_COLLECTION); @@ -315,7 +315,7 @@ public class AggregationTests { } } - @Test // GH- + @Test // GH-4949 void shouldAggregateWithConverter() { MongoCollection coll = mongoTemplate.getCollection(INPUT_COLLECTION); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ReactiveAggregationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ReactiveAggregationTests.java index 62d13a8f2..92c1d2cd9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ReactiveAggregationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/ReactiveAggregationTests.java @@ -116,7 +116,7 @@ public class ReactiveAggregationTests { }).verifyComplete(); } - @Test // GH-… + @Test // GH-4949 public void shouldProjectAndConvertMultipleDocuments() { City dresden = new City("Dresden", 100);