From 4d600943f4ffb75e630eaa3ec7df605c94ea76dd Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 11 Nov 2021 10:00:38 +0100 Subject: [PATCH 1/5] Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-benchmarks/pom.xml | 2 +- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 5a4c5b7dae..481a85b1b3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 3.3.0-SNAPSHOT + 3.3.0-GH-3871-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 0033bd11d5..aff481b04b 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 3.3.0-SNAPSHOT + 3.3.0-GH-3871-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index f62c8dc7f4..52e25afc4c 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -14,7 +14,7 @@ org.springframework.data spring-data-mongodb-parent - 3.3.0-SNAPSHOT + 3.3.0-GH-3871-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 2f73c10eba..49e06c0492 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 3.3.0-SNAPSHOT + 3.3.0-GH-3871-SNAPSHOT ../pom.xml From a8cc3fafed7a50139a09856fbe25d3f8e4c76427 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 11 Nov 2021 12:17:39 +0100 Subject: [PATCH 2/5] Fix Expression parse error when collecting SpEL extensions for queries computed entirely via expression. This commit makes sure the extension collector returns a marker object to indicate no further json parsing is required. --- .../json/ParameterBindingDocumentCodec.java | 6 ++++-- .../util/json/ParameterBindingJsonReader.java | 17 ++++++++++------- .../ParameterBindingJsonReaderUnitTests.java | 9 +++++++++ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java index 18c9c25283..ae65a64a88 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java @@ -18,6 +18,7 @@ import static java.util.Arrays.*; import static org.bson.assertions.Assertions.*; import static org.bson.codecs.configuration.CodecRegistries.*; +import static org.springframework.data.mongodb.util.json.ParameterBindingJsonReader.*; import java.util.ArrayList; import java.util.Collection; @@ -217,6 +218,9 @@ public Document decode(final BsonReader reader, final DecoderContext decoderCont if (bindingReader.currentValue instanceof org.bson.Document) { return (Document) bindingReader.currentValue; } + if(ObjectUtils.nullSafeEquals(bindingReader.currentValue, PLACEHOLDER)) { + return new Document(); + } } Document document = new Document(); @@ -377,8 +381,6 @@ private List readList(final BsonReader reader, final DecoderContext deco */ static class DependencyCapturingExpressionEvaluator implements SpELExpressionEvaluator { - private static final Object PLACEHOLDER = new Object(); - private final ExpressionParser expressionParser; private final List dependencies = new ArrayList<>(); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java index 17f8915df1..7ab379bac3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java @@ -61,7 +61,10 @@ */ public class ParameterBindingJsonReader extends AbstractBsonReader { + static final Object PLACEHOLDER = new Object(); + private static final Pattern PARAMETER_ONLY_BINDING_PATTERN = Pattern.compile("^\\?(\\d+)$"); + private static final Pattern EXPRESSION_ONLY_BINDING_PATTERN = Pattern.compile("^\\?#\\{.*\\}$"); private static final Pattern PARAMETER_BINDING_PATTERN = Pattern.compile("\\?(\\d+)"); private static final Pattern EXPRESSION_BINDING_PATTERN = Pattern.compile("[\\?:]#\\{.*\\}"); @@ -110,11 +113,7 @@ public ParameterBindingJsonReader(String json, ValueProvider accessor, SpelExpre setContext(new Context(null, BsonContextType.TOP_LEVEL)); this.bindingContext = new ParameterBindingContext(accessor, spelExpressionParser, evaluationContext); - - Matcher matcher = PARAMETER_ONLY_BINDING_PATTERN.matcher(json); - if (matcher.find()) { - currentValue = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)).getValue(); - } + setInitialValueIfFullDocumentExpression(json); } public ParameterBindingJsonReader(String json, ParameterBindingContext bindingContext) { @@ -123,9 +122,13 @@ public ParameterBindingJsonReader(String json, ParameterBindingContext bindingCo setContext(new Context(null, BsonContextType.TOP_LEVEL)); this.bindingContext = bindingContext; + setInitialValueIfFullDocumentExpression(json); + } - Matcher matcher = PARAMETER_ONLY_BINDING_PATTERN.matcher(json); - if (matcher.find()) { + public void setInitialValueIfFullDocumentExpression(String json) { + if (PARAMETER_ONLY_BINDING_PATTERN.matcher(json).find()) { + currentValue = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)).getValue(); + } else if (EXPRESSION_ONLY_BINDING_PATTERN.matcher(json).find()) { currentValue = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)).getValue(); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java index 1a684af164..e41402ccd2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java @@ -358,6 +358,15 @@ void evaluatesSpelExpressionDefiningEntireQuery() { new Document("user.supervisor", "wonderwoman")))); } + @Test // GH-3871 + public void capturingExpressionDependenciesShouldNotThrowParseErrorForSpelOnlyJson() { + + Object[] args = new Object[] { "1", "2" }; + String json = "?#{ true ? { 'name': #name } : { 'name' : #name + 'trouble' } }"; + + new ParameterBindingDocumentCodec().captureExpressionDependencies(json, (index) -> args[index], new SpelExpressionParser()); + } + @Test // DATAMONGO-2571 void shouldParseRegexCorrectly() { From 9ef190aff33e8692ab6ee01962c8b4afc77a8f56 Mon Sep 17 00:00:00 2001 From: rolag-it Date: Tue, 7 Dec 2021 18:10:40 +0100 Subject: [PATCH 3/5] Fix expression defining entire query in annotated repository methods. This fix enables defining an entire JSON-based query in Query and Aggregate annotations using a single parameter or SpEL Expression. --- .../json/ParameterBindingDocumentCodec.java | 13 +++-- .../util/json/ParameterBindingJsonReader.java | 26 +++++---- .../ParameterBindingJsonReaderUnitTests.java | 53 ++++++++++++++++++- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java index 18c9c25283..0ce78a7f31 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java @@ -31,6 +31,7 @@ import org.bson.BsonBinarySubType; import org.bson.BsonDocument; import org.bson.BsonDocumentWriter; +import org.bson.BsonInvalidOperationException; import org.bson.BsonReader; import org.bson.BsonType; import org.bson.BsonValue; @@ -61,6 +62,7 @@ * @author Ross Lawley * @author Ralph Schaer * @author Christoph Strobl + * @author Rocco Lagrotteria * @since 2.2 */ public class ParameterBindingDocumentCodec implements CollectibleCodec { @@ -217,19 +219,24 @@ public Document decode(final BsonReader reader, final DecoderContext decoderCont if (bindingReader.currentValue instanceof org.bson.Document) { return (Document) bindingReader.currentValue; } + } Document document = new Document(); - reader.readStartDocument(); try { + reader.readStartDocument(); + while (reader.readBsonType() != BsonType.END_OF_DOCUMENT) { String fieldName = reader.readName(); Object value = readValue(reader, decoderContext); document.put(fieldName, value); } - } catch (JsonParseException e) { + + reader.readEndDocument(); + + } catch (JsonParseException | BsonInvalidOperationException e) { try { Object value = readValue(reader, decoderContext); @@ -244,8 +251,6 @@ public Document decode(final BsonReader reader, final DecoderContext decoderCont } } - reader.readEndDocument(); - return document; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java index 17f8915df1..b3e323ec12 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java @@ -57,11 +57,12 @@ * @author Florian Buecklers * @author Brendon Puntin * @author Christoph Strobl + * @author Rocco Lagrotteria * @since 2.2 */ public class ParameterBindingJsonReader extends AbstractBsonReader { - private static final Pattern PARAMETER_ONLY_BINDING_PATTERN = Pattern.compile("^\\?(\\d+)$"); + private static final Pattern ENTIRE_QUERY_BINDING_PATTERN = Pattern.compile("^\\?(\\d+)$|^[\\?:]#\\{.*\\}$"); private static final Pattern PARAMETER_BINDING_PATTERN = Pattern.compile("\\?(\\d+)"); private static final Pattern EXPRESSION_BINDING_PATTERN = Pattern.compile("[\\?:]#\\{.*\\}"); @@ -106,15 +107,8 @@ public ParameterBindingJsonReader(String json, ValueProvider accessor, SpelExpre public ParameterBindingJsonReader(String json, ValueProvider accessor, SpelExpressionParser spelExpressionParser, Supplier evaluationContext) { - this.scanner = new JsonScanner(json); - setContext(new Context(null, BsonContextType.TOP_LEVEL)); - - this.bindingContext = new ParameterBindingContext(accessor, spelExpressionParser, evaluationContext); + this(json, new ParameterBindingContext(accessor, spelExpressionParser, evaluationContext)); - Matcher matcher = PARAMETER_ONLY_BINDING_PATTERN.matcher(json); - if (matcher.find()) { - currentValue = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)).getValue(); - } } public ParameterBindingJsonReader(String json, ParameterBindingContext bindingContext) { @@ -124,10 +118,20 @@ public ParameterBindingJsonReader(String json, ParameterBindingContext bindingCo this.bindingContext = bindingContext; - Matcher matcher = PARAMETER_ONLY_BINDING_PATTERN.matcher(json); + Matcher matcher = ENTIRE_QUERY_BINDING_PATTERN.matcher(json); if (matcher.find()) { - currentValue = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)).getValue(); + BindableValue bindingResult = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)); + try { + if (bindingResult.getType().equals(BsonType.DOCUMENT)) { + currentValue = Document.parse(bindingResult.getValue().toString()); + } + + } catch (JsonParseException jsonParseException) { + throw new IllegalArgumentException( + String.format("Resulting value of expression '%s' is not a valid json query", json), jsonParseException); + } } + } // Spring Data Customization END diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java index 1a684af164..bc5cee5ebf 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java @@ -41,6 +41,7 @@ * * @author Christoph Strobl * @author Mark Paluch + * @author Rocco Lagrotteria */ class ParameterBindingJsonReaderUnitTests { @@ -347,7 +348,26 @@ void evaluatesSpelExpressionDefiningEntireQuery() { evaluationContext.setRootObject(new DummySecurityObject(new DummyWithId("wonderwoman"))); String json = "?#{ T(" + this.getClass().getName() - + ").isBatman() ? {'_class': { '$eq' : 'region' }} : { '$and' : { {'_class': { '$eq' : 'region' } }, {'user.supervisor': principal.id } } } }"; + + ").isBatman() ? \"{'_class': { '$eq' : 'region' }}\" : \"{ '$and' : [ {'_class': { '$eq' : 'region' } }, {'user.supervisor': '\"+ principal.id +\"' } ] }\" }"; + + ParameterBindingJsonReader reader = new ParameterBindingJsonReader(json, + new ParameterBindingContext((index) -> args[index], new SpelExpressionParser(), evaluationContext)); + Document target = new ParameterBindingDocumentCodec().decode(reader, DecoderContext.builder().build()); + + assertThat(target) + .isEqualTo(new Document("$and", Arrays.asList(new Document("_class", new Document("$eq", "region")), + new Document("user.supervisor", "wonderwoman")))); + } + + @Test + void bindEntireQueryUsingSpelExpression() { + + Object[] args = new Object[] {"region"}; + StandardEvaluationContext evaluationContext = (StandardEvaluationContext) EvaluationContextProvider.DEFAULT + .getEvaluationContext(args); + evaluationContext.setRootObject(new DummySecurityObject(new DummyWithId("wonderwoman"))); + + String json = "?#{ T(" + this.getClass().getName() + ").applyFilterByUser('?0' ,principal.id) }"; ParameterBindingJsonReader reader = new ParameterBindingJsonReader(json, new ParameterBindingContext((index) -> args[index], new SpelExpressionParser(), evaluationContext)); @@ -358,6 +378,24 @@ void evaluatesSpelExpressionDefiningEntireQuery() { new Document("user.supervisor", "wonderwoman")))); } + @Test + void bindEntireQueryUsingParameter() { + + Object[] args = new Object[] {"{ 'itWorks' : true }"}; + StandardEvaluationContext evaluationContext = (StandardEvaluationContext) EvaluationContextProvider.DEFAULT + .getEvaluationContext(args); + + String json = "?0"; + + ParameterBindingJsonReader reader = new ParameterBindingJsonReader(json, + new ParameterBindingContext((index) -> args[index], new SpelExpressionParser(), evaluationContext)); + Document target = new ParameterBindingDocumentCodec().decode(reader, DecoderContext.builder().build()); + + assertThat(target) + .isEqualTo(new Document("itWorks", true)); + + } + @Test // DATAMONGO-2571 void shouldParseRegexCorrectly() { @@ -400,6 +438,19 @@ private static Document parse(String json, Object... args) { public static boolean isBatman() { return false; } + + public static String applyFilterByUser(String _class, String username) { + switch (username) { + case "batman": + return "{'_class': { '$eq' : '" + + _class + + "' }}"; + default: + return "{ '$and' : [ {'_class': { '$eq' : '" + + _class + + "' } }, {'user.supervisor': '" + username + "' } ] }"; + } + } @Data @AllArgsConstructor From 4cc0e7bb290c55fdaa56dde7c1d7d2bf85985ba8 Mon Sep 17 00:00:00 2001 From: rolag-it Date: Tue, 7 Dec 2021 18:16:23 +0100 Subject: [PATCH 4/5] Polishing. Replace calls to deprecated methods. Remove unsed variables. Optimize imports. --- .../json/ParameterBindingDocumentCodec.java | 23 +++++++++++++------ .../util/json/ParameterBindingJsonReader.java | 17 ++++++++++---- .../ParameterBindingJsonReaderUnitTests.java | 1 - 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java index 0ce78a7f31..34a446d8ee 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingDocumentCodec.java @@ -15,12 +15,11 @@ */ package org.springframework.data.mongodb.util.json; -import static java.util.Arrays.*; -import static org.bson.assertions.Assertions.*; -import static org.bson.codecs.configuration.CodecRegistries.*; +import static java.util.Arrays.asList; +import static org.bson.assertions.Assertions.notNull; +import static org.bson.codecs.configuration.CodecRegistries.fromProviders; import java.util.ArrayList; -import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; @@ -38,7 +37,17 @@ import org.bson.BsonWriter; import org.bson.Document; import org.bson.Transformer; -import org.bson.codecs.*; +import org.bson.codecs.BsonTypeClassMap; +import org.bson.codecs.BsonTypeCodecMap; +import org.bson.codecs.BsonValueCodecProvider; +import org.bson.codecs.Codec; +import org.bson.codecs.CollectibleCodec; +import org.bson.codecs.DecoderContext; +import org.bson.codecs.DocumentCodecProvider; +import org.bson.codecs.EncoderContext; +import org.bson.codecs.IdGenerator; +import org.bson.codecs.ObjectIdGenerator; +import org.bson.codecs.ValueCodecProvider; import org.bson.codecs.configuration.CodecRegistry; import org.bson.json.JsonParseException; import org.springframework.data.mapping.model.SpELExpressionEvaluator; @@ -174,7 +183,7 @@ public Document decode(@Nullable String json, Object[] values) { public Document decode(@Nullable String json, ParameterBindingContext bindingContext) { - if (StringUtils.isEmpty(json)) { + if (!StringUtils.hasText(json)) { return new Document(); } @@ -195,7 +204,7 @@ public Document decode(@Nullable String json, ParameterBindingContext bindingCon public ExpressionDependencies captureExpressionDependencies(@Nullable String json, ValueProvider valueProvider, ExpressionParser expressionParser) { - if (StringUtils.isEmpty(json)) { + if (!StringUtils.hasText(json)) { return ExpressionDependencies.none(); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java index b3e323ec12..07a74f430b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java @@ -15,7 +15,7 @@ */ package org.springframework.data.mongodb.util.json; -import static java.lang.String.*; +import static java.lang.String.format; import java.text.DateFormat; import java.text.ParsePosition; @@ -29,14 +29,24 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.bson.*; +import org.bson.AbstractBsonReader; +import org.bson.BsonBinary; +import org.bson.BsonBinarySubType; +import org.bson.BsonContextType; +import org.bson.BsonDbPointer; +import org.bson.BsonInvalidOperationException; +import org.bson.BsonReaderMark; +import org.bson.BsonRegularExpression; +import org.bson.BsonTimestamp; +import org.bson.BsonType; +import org.bson.BsonUndefined; +import org.bson.Document; import org.bson.internal.Base64; import org.bson.json.JsonParseException; import org.bson.types.Decimal128; import org.bson.types.MaxKey; import org.bson.types.MinKey; import org.bson.types.ObjectId; - import org.springframework.data.spel.EvaluationContextProvider; import org.springframework.expression.EvaluationContext; import org.springframework.expression.spel.standard.SpelExpressionParser; @@ -71,7 +81,6 @@ public class ParameterBindingJsonReader extends AbstractBsonReader { private final JsonScanner scanner; private JsonToken pushedToken; Object currentValue; - private Mark mark; /** * Constructs a new instance with the given JSON string. diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java index bc5cee5ebf..5a4318e1ba 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReaderUnitTests.java @@ -193,7 +193,6 @@ void bindQuotedDateAsDate() { @Test // DATAMONGO-2315 void bindStringAsDate() { - Date date = new Date(); Document target = parse("{ 'end_date' : { $gte : { $date : ?0 } } }", "2019-07-04T12:19:23.000Z"); assertThat(target).isEqualTo(Document.parse("{ 'end_date' : { $gte : { $date : '2019-07-04T12:19:23.000Z' } } } ")); From 5ba0f67f09c21f23431be8636d868ef37c7a9354 Mon Sep 17 00:00:00 2001 From: rolag-it Date: Mon, 17 Jan 2022 10:44:46 +0100 Subject: [PATCH 5/5] Fix parsing of expression binding result Changed condition for Document parsing only when expression return a String --- .../data/mongodb/util/json/ParameterBindingJsonReader.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java index cd01969658..21eac114ac 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java @@ -134,8 +134,11 @@ public ParameterBindingJsonReader(String json, ParameterBindingContext bindingCo if (matcher.find()) { BindableValue bindingResult = bindableValueFor(new JsonToken(JsonTokenType.UNQUOTED_STRING, json)); try { - if (bindingResult.getType().equals(BsonType.DOCUMENT)) { - currentValue = Document.parse(bindingResult.getValue().toString()); + + if (bindingResult.getValue() instanceof String) { + currentValue = Document.parse((String)bindingResult.getValue()); + } else { + currentValue = bindingResult.getValue(); } } catch (JsonParseException jsonParseException) {