From 7290d7805334fa583a0ac7be4a079884fc98580a Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 21 Mar 2023 08:24:48 +0100 Subject: [PATCH] Fix null value handling in `ParameterBindingJsonReader#readStringFromExtendedJson`. This commit makes sure to return null for a null parameter value avoiding a potential NPE when parsing data. In doing so we can ensure object creation is done with the intended value that may or may not lead to a downstream error eg. when trying to create an ObjectId with a null hexString. Closes: #4282 Original pull request: #4334 --- .../data/mongodb/util/json/ParameterBindingJsonReader.java | 3 ++- .../util/json/ParameterBindingJsonReaderUnitTests.java | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 da6bf8cb7..2a718661c 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 @@ -1425,7 +1425,8 @@ public class ParameterBindingJsonReader extends AbstractBsonReader { // Spring Data Customization START if (patternToken.getType() == JsonTokenType.STRING || patternToken.getType() == JsonTokenType.UNQUOTED_STRING) { - return bindableValueFor(patternToken).getValue().toString(); + Object value = bindableValueFor(patternToken).getValue(); + return value != null ? value.toString() : null; } throw new JsonParseException("JSON reader expected a string but found '%s'.", patternToken.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 bd82d7d7d..9689c21b3 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 @@ -209,6 +209,13 @@ class ParameterBindingJsonReaderUnitTests { assertThat(target).isEqualTo(Document.parse("{ 'end_date' : { $gte : { $date : " + time + " } } } ")); } + @Test // GH-4282 + public void shouldReturnNullAsSuch() { + + String json = "{ 'value' : ObjectId(?0) }"; + assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> parse(json, new Object[] { null })); + } + @Test // DATAMONGO-2418 void shouldNotAccessSpElEvaluationContextWhenNoSpElPresentInBindableTarget() {