diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/BindableMongoExpression.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/BindableMongoExpression.java index e2e0c0ed97..783ab565cc 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/BindableMongoExpression.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/BindableMongoExpression.java @@ -23,13 +23,14 @@ import org.springframework.data.mongodb.util.json.ParameterBindingDocumentCodec; import org.springframework.data.util.Lazy; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** * A {@link MongoExpression} using the {@link ParameterBindingDocumentCodec} for parsing a raw ({@literal json}) * expression. The expression will be wrapped within { ... } if necessary. The actual parsing and parameter - * binding of placeholders like {@code ?0} is delayed upon first call on the the target {@link Document} via + * binding of placeholders like {@code ?0} is delayed upon first call on the target {@link Document} via * {@link #toDocument()}. *
* @@ -45,6 +46,7 @@ * containing the required {@link org.bson.codecs.Codec codec} via {@link #withCodecRegistry(CodecRegistry)}. * * @author Christoph Strobl + * @author Giacomo Baso * @since 3.2 */ public class BindableMongoExpression implements MongoExpression { @@ -77,7 +79,9 @@ public BindableMongoExpression(String expression, @Nullable Object[] args) { public BindableMongoExpression(String expression, @Nullable CodecRegistryProvider codecRegistryProvider, @Nullable Object[] args) { - this.expressionString = expression; + Assert.notNull(expression, "Expression must not be null"); + + this.expressionString = expression.trim(); this.codecRegistryProvider = codecRegistryProvider; this.args = args; this.target = Lazy.of(this::parse); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateFieldProjectionTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateFieldProjectionTests.java index b3420ff227..d3a20360b8 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateFieldProjectionTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateFieldProjectionTests.java @@ -42,6 +42,7 @@ * * @author Christoph Strobl * @author Mark Paluch + * @author Giacomo Baso */ @ExtendWith(MongoTemplateExtension.class) @EnableIfMongoServerVersion(isGreaterThanEqual = "4.4") @@ -89,6 +90,21 @@ void usesMongoExpressionWithPlaceholdersAsIs() { assertThat(result).isEqualTo(luke.upperCaseLastnameClone()); } + @Test // GH-4821 + void usesMongoExpressionWithLineBreaksAsIs() { + + Person result = findLuke(fields -> { + fields.include("firstname").project(MongoExpression.create(""" + { + '$toUpper' : '$last_name' + } + """)) + .as("last_name"); + }); + + assertThat(result).isEqualTo(luke.upperCaseLastnameClone()); + } + @Test // GH-3583 void mapsAggregationExpressionToDomainType() {