From d62639d11c92100adf46d35c9eb378ebc7f3d6bc Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 12 Apr 2021 08:58:31 +0200 Subject: [PATCH] Fix NPE in declarative aggregation execution. This commit fixes an issue where using a simple return type leads to NPE when the actual aggregation result does not contain any values. Closes: #3623 Original pull request: #3625. --- .../mongodb/repository/query/AggregationUtils.java | 4 ++-- .../query/StringBasedAggregationUnitTests.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java index 2333917f3..c06a7a691 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AggregationUtils.java @@ -196,9 +196,9 @@ class AggregationUtils { * @throws IllegalArgumentException when none of the above rules is met. */ @Nullable - static T extractSimpleTypeResult(Document source, Class targetType, MongoConverter converter) { + static T extractSimpleTypeResult(@Nullable Document source, Class targetType, MongoConverter converter) { - if (source.isEmpty()) { + if (source == null || source.isEmpty()) { return null; } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java index cc0890785..7ff8825c0 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedAggregationUnitTests.java @@ -156,6 +156,14 @@ public class StringBasedAggregationUnitTests { assertThat(executeAggregation("returnCollection").result).isEqualTo(expected); } + @Test // GH-3623 + public void returnNullWhenSingleResultIsNotPresent() { + + when(aggregationResults.getMappedResults()).thenReturn(Collections.emptyList()); + + assertThat(executeAggregation("simpleReturnType").result).isNull(); + } + @Test // DATAMONGO-2153 public void returnRawResultType() { assertThat(executeAggregation("returnRawResultType").result).isEqualTo(aggregationResults); @@ -299,6 +307,9 @@ public class StringBasedAggregationUnitTests { @Aggregation(RAW_GROUP_BY_LASTNAME_STRING) Page invalidPageReturnType(Pageable page); + + @Aggregation(RAW_GROUP_BY_LASTNAME_STRING) + String simpleReturnType(); } static class PersonAggregate {