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 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() {