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